diff --git a/bot/pluralkit/commands.py b/bot/pluralkit/commands.py index 9a8e2296..7ba98951 100644 --- a/bot/pluralkit/commands.py +++ b/bot/pluralkit/commands.py @@ -62,11 +62,12 @@ async def system_set(conn, message, args): if system is None: return False, "No system is registered to this account." - allowed_properties = ["name", "description", "tag"] + allowed_properties = ["name", "description", "tag", "avatar"] db_properties = { "name": "name", "description": "description", - "tag": "tag" + "tag": "tag", + "avatar": "avatar_url" } prop = args[0] @@ -86,6 +87,20 @@ async def system_set(conn, message, args): for member in members_exceeding]) logger.debug("Members exceeding combined length with tag '{}': {}".format(value, member_names)) return False, "The maximum length of a name plus the system tag is 32 characters. The following members would exceed the limit: {}. Please reduce the length of the tag, or rename the members.".format(member_names) + + if prop == "avatar": + user = await parse_mention(value) + if user: + # Set the avatar to the mentioned user's avatar + # Discord doesn't like webp, but also hosts png alternatives + value = user.avatar_url.replace(".webp", ".png") + else: + # Validate URL + u = urlparse(value) + if u.scheme in ["http", "https"] and u.netloc and u.path: + value = value + else: + return False, "Invalid URL." else: # Clear from DB value = None @@ -93,7 +108,11 @@ async def system_set(conn, message, args): db_prop = db_properties[prop] await db.update_system_field(conn, system_id=system["id"], field=db_prop, value=value) - return True, "{} system {}.".format("Updated" if value else "Cleared", prop) + if prop == "avatar" and value: + response = make_default_embed("Updated system avatar.").set_image(url=value) + else: + response = "{} system {}.".format("Updated" if value else "Cleared", prop) + return True, response @command(cmd="system link", usage="", description="Links another account to your system.", category="System commands") async def system_link(conn, message, args): @@ -326,7 +345,7 @@ async def member_set(conn, message, member, args): db_prop = db_properties[prop] await db.update_member_field(conn, member_id=member["id"], field=db_prop, value=value) - if prop == "avatar": + if prop == "avatar" and value: response = make_default_embed("Updated {}'s avatar.".format(member["name"])).set_image(url=value) else: response = "{} {}'s {}.".format("Updated" if value else "Cleared", member["name"], prop) diff --git a/bot/pluralkit/db.py b/bot/pluralkit/db.py index b99aa89f..440af3fb 100644 --- a/bot/pluralkit/db.py +++ b/bot/pluralkit/db.py @@ -231,6 +231,7 @@ async def create_tables(conn): name text, description text, tag text, + avatar_url text, created timestamp not null default current_timestamp )""") await conn.execute("""create table if not exists members ( diff --git a/bot/pluralkit/help.py b/bot/pluralkit/help.py index 79463cb7..89217891 100644 --- a/bot/pluralkit/help.py +++ b/bot/pluralkit/help.py @@ -28,7 +28,10 @@ For example: For example: `pk;system set name My System` - sets your system name to "My System". `pk;system set description A really cool system.` - sets your system description. -`pk;system set tag [MS]` - Sets the tag (which will be displayed after member names in messages) to "[MS]"."""), +`pk;system set tag [MS]` - Sets the tag (which will be displayed after member names in messages) to "[MS]". +`pk;system set avatar https://placekitten.com/400/400` - Changes your system's avatar to a linked image. + +If you don't specify any value, the property will be cleared."""), ("Linking accounts", """If your system has multiple accounts, you can link all of them to your system, and you can use the bot from all of those accounts. @@ -64,7 +67,9 @@ For example: `pk;member set John birthdate 1996-02-27` - Changes John's birthdate to Feb 27, 1996. (Must be YYYY-MM-DD format). `pk;member set John birthdate 02-27` - Changes John's birthdate to February 27th, with no year. `pk;member set John avatar https://placekitten.com/400/400` - Changes John's avatar to a linked image. -`pk;member set John avatar @JohnsAccount` - Changes John's avatar to the avatar of the mentioned account."""), +`pk;member set John avatar @JohnsAccount` - Changes John's avatar to the avatar of the mentioned account. + +If you don't specify any value, the property will be cleared."""), ("Removing a member", """If you want to delete a member, you can use the `pk;member delete` command. diff --git a/bot/pluralkit/utils.py b/bot/pluralkit/utils.py index 993051ed..028f1d10 100644 --- a/bot/pluralkit/utils.py +++ b/bot/pluralkit/utils.py @@ -204,6 +204,9 @@ async def generate_system_info_card(conn, system: asyncpg.Record) -> discord.Emb if system["name"]: card.title = system["name"] + if system["avatar_url"]: + card.set_thumbnail(url=system["avatar_url"]) + if system["tag"]: card.add_field(name="Tag", value=system["tag"])