Identify servers.
authorCMDR furrycat <elite@furrycat.net>
Thu, 2 Mar 2017 12:03:49 +0000 (12:03 +0000)
committerCMDR furrycat <elite@furrycat.net>
Thu, 2 Mar 2017 12:03:49 +0000 (12:03 +0000)
plugin/developer/developer.py

index bf5a5c2..233ebe7 100644 (file)
@@ -14,6 +14,7 @@ class Identify(Enum):
   member = 1
   role = 2
   channel = 4
+  server = 8
 
   def string(instance):
     if type(instance) == discord.member.Member:
@@ -26,6 +27,8 @@ class Identify(Enum):
       if instance.type == discord.ChannelType.voice:
         return 'Voice Channel ({}bps)'.format(instance.bitrate)
       return 'Channel'
+    elif type(instance) == discord.server.Server:
+      return 'Server'
 
 class Developer(object):
   def description(self):
@@ -64,23 +67,25 @@ class Developer(object):
       ]
     elif command == 'id':
       lines = [
-        'Print the Discord IDs of member, roles or channels known to me.',
+        'Print the Discord IDs of servers, members, roles or channels known to me.',
         '```',
+        'id SERVER',
         'id MEMBER',
         'id ROLE',
         'id CHANNEL',
         '```',
-        'Prints the ID of the member, role or channel with the given name.',
+        'Prints the ID of the server, member, role or channel with the given name.',
         "I can only identify someone or something if I share a server.",
         'Useful for `announce create` to specify a `voice` channel, which must be done by ID.',
         '',
         '```',
+        'id --servers',
         'id --members',
         'id --roles',
         'id --channels',
         'id',
         '```',
-        'Identify all MEMBERs, ROLEs or CHANNELs known to me.',
+        'Identify all SERVERs, MEMBERs, ROLEs or CHANNELs known to me.',
         "If you don't give any arguments I'll identify everyone and everything I know about.",
         'Note that if I share more than one server with a member, that member will be listed twice with two IDs!',
         "Also note that because of the Discord message length limit I'll probably have to split my reply into multiple posts."
@@ -131,16 +136,18 @@ class Developer(object):
 
   @asyncio.coroutine
   def handle_id(self, message, args):
-    do = Identify.member.value | Identify.role.value | Identify.channel.value
+    do = Identify.member.value | Identify.role.value | Identify.channel.value | Identify.server.value
     target = None
     channel_id = None
     role_id = None
     member_id = None
+    server_id = None
 
     ap = ThrowingArgumentParser()
     ap.add_argument('--channel', '--channels', action='store_true')
     ap.add_argument('--member', '--members', action='store_true')
     ap.add_argument('--role', '--roles', action='store_true')
+    ap.add_argument('--server', '--servers', action='store_true')
     ap.add_argument('target', nargs='?')
     try:
       parsed = ap.parse_args(args)
@@ -163,9 +170,11 @@ class Developer(object):
         elif prefix == '#':
           channel_id = str(id)
           do = Identify.channel.value
+      elif re.match(r'^\d+$', parsed.target):
+        server_id = str(target)
       else:
         target = parsed.target
-    elif parsed.channel or parsed.member or parsed.role:
+    elif parsed.channel or parsed.member or parsed.role or parsed.server:
       do = 0
       if parsed.channel:
         do |= Identify.channel.value
@@ -173,6 +182,8 @@ class Developer(object):
         do |= Identify.member.value
       if parsed.role:
         do |= Identify.role.value
+      if parsed.server:
+        do |= Identify.server.value
 
     results = []
     if do & Identify.member.value:
@@ -214,5 +225,15 @@ class Developer(object):
           if target and channel.name.lower() != target.lower():
             continue
           results.append(channel)
+    if do & Identify.server.value:
+      if server_id:
+        for server in client.servers:
+          if server.id == server_id:
+            results.append(server)
+      else:
+        for server in client.servers:
+          if target and server.name.lower() != target.lower():
+            continue
+          results.append(server)
 
     yield from bot.say_many(message.channel, ['{} {} {}'.format(Identify.string(result), result.id, result.name) for result in set(results)])