From 5093ba8e2a57214dfca160aaee69fa004241ffc5 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sat, 25 Apr 2020 23:39:20 -0800 Subject: [PATCH 01/13] Add closer to ticket detail view --- Dockerfile | 3 ++- geeksbot/exts/tickets.py | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index eac1469..d590ea2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,8 @@ RUN apk update && \ # https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell && apk add postgresql-client \ # Install git - && apk add git openssh-client + && apk add git openssh-client \ + && apk add ghc RUN mkdir /code WORKDIR /code diff --git a/geeksbot/exts/tickets.py b/geeksbot/exts/tickets.py index b0667c0..a5ec481 100644 --- a/geeksbot/exts/tickets.py +++ b/geeksbot/exts/tickets.py @@ -248,6 +248,10 @@ class Tickets(commands.Cog): pag.add(f'{author.display_name}: {comment["content"]}', keep_intact=True) else: pag.add('No Comments') + + if request.get('completed'): + closer = ctx.guild.get_memeber(int(request.get('completed_by_id'))) + pag.add(f'Closed By: {closer.username}#{closer.discriminator}\n{request.get("completed_message")}') book = Book(pag, (None, ctx.channel, self.bot, ctx.message)) await book.create_book() else: From 3b26c8ca4ccc8a0b29495bbeeb1c17b1f0e911bd Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sat, 25 Apr 2020 23:40:41 -0800 Subject: [PATCH 02/13] Fix typo --- geeksbot/exts/tickets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geeksbot/exts/tickets.py b/geeksbot/exts/tickets.py index a5ec481..b4e769c 100644 --- a/geeksbot/exts/tickets.py +++ b/geeksbot/exts/tickets.py @@ -250,7 +250,7 @@ class Tickets(commands.Cog): pag.add('No Comments') if request.get('completed'): - closer = ctx.guild.get_memeber(int(request.get('completed_by_id'))) + closer = ctx.guild.get_member(int(request.get('completed_by_id'))) pag.add(f'Closed By: {closer.username}#{closer.discriminator}\n{request.get("completed_message")}') book = Book(pag, (None, ctx.channel, self.bot, ctx.message)) await book.create_book() From dd8b4f4f1c42c1a6552ebffa9f761ec259cc5047 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sat, 25 Apr 2020 23:45:27 -0800 Subject: [PATCH 03/13] Fix typo --- geeksbot/exts/tickets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geeksbot/exts/tickets.py b/geeksbot/exts/tickets.py index b4e769c..2d35383 100644 --- a/geeksbot/exts/tickets.py +++ b/geeksbot/exts/tickets.py @@ -250,7 +250,7 @@ class Tickets(commands.Cog): pag.add('No Comments') if request.get('completed'): - closer = ctx.guild.get_member(int(request.get('completed_by_id'))) + closer = ctx.guild.get_member(int(request.get('completed_by'))) pag.add(f'Closed By: {closer.username}#{closer.discriminator}\n{request.get("completed_message")}') book = Book(pag, (None, ctx.channel, self.bot, ctx.message)) await book.create_book() From b58bb3efe57a81ac3ff2759c5e7a447818fff33b Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sat, 25 Apr 2020 23:46:16 -0800 Subject: [PATCH 04/13] Fix typo --- geeksbot/exts/tickets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geeksbot/exts/tickets.py b/geeksbot/exts/tickets.py index 2d35383..f20cbfe 100644 --- a/geeksbot/exts/tickets.py +++ b/geeksbot/exts/tickets.py @@ -251,7 +251,7 @@ class Tickets(commands.Cog): if request.get('completed'): closer = ctx.guild.get_member(int(request.get('completed_by'))) - pag.add(f'Closed By: {closer.username}#{closer.discriminator}\n{request.get("completed_message")}') + pag.add(f'Closed By: {closer.name}#{closer.discriminator}\n{request.get("completed_message")}') book = Book(pag, (None, ctx.channel, self.bot, ctx.message)) await book.create_book() else: From b4f7ac95b818dc226891e417120bf67afc542f97 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Thu, 30 Apr 2020 22:08:02 -0800 Subject: [PATCH 05/13] Change ping command --- geeksbot/exts/admin.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/geeksbot/exts/admin.py b/geeksbot/exts/admin.py index 3e6151e..0adaf59 100644 --- a/geeksbot/exts/admin.py +++ b/geeksbot/exts/admin.py @@ -5,6 +5,7 @@ import inspect import sys import psutil import math +import time from geeksbot.imports import utils admin_logger = logging.getLogger('admin') @@ -60,10 +61,10 @@ class Admin(commands.Cog): title=f'Pong 🏓', color=discord.Colour.green() ) + time1 = time.monotonic() msg = await ctx.send(embed=em) - time1 = ctx.message.created_at - time = (msg.created_at - time1).total_seconds() * 1000 - em.description = f'Response Time: **{math.ceil(time)}ms**\n' \ + time_dif = (time.monotonic() - time1) * 1000 + em.description = f'Response Time: **{math.ceil(time_dif)}ms**\n' \ f'Discord Latency: **{math.ceil(self.bot.latency*1000)}ms**' await msg.edit(embed=em) From 043de8a9e87d6bda83d185ad23302fe8cd8a42fd Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 00:59:39 -0800 Subject: [PATCH 06/13] Add broadcast command --- geeksbot/exts/rcon.py | 143 +++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 77 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 3fb2e93..bd1736b 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -559,83 +559,72 @@ class Rcon(commands.Cog): # await ctx.send(f'{server} is not currently in the configuration for this guild.') # else: # await ctx.send(f'You are not authorized to run this command.') - # - # @commands.group(case_insensitive=True) - # async def broadcast(self, ctx): - # """Run help broadcast for more info""" - # pass - # - # @broadcast.command(name='all', aliases=['a']) - # @commands.guild_only() - # async def broadcast_all(self, ctx, *, message=None): - # """Sends a broadcast message to all servers in the guild config. - # The message will be prefixed with the Discord name of the person running the command. - # Will print "Success" for each server once the broadcast is sent.""" - # if await checks.is_rcon_admin(self.bot, ctx): - # if message is not None: - # - # # noinspection PyShadowingNames - # async def _broadcast(*, message: str, server_con: arcon.ARKServer, server_name: str, - # msg: discord.Message, message_lock: asyncio.Lock): - # print(server_con.host, server_con.port) - # response = await server_con.broadcast(message) - # if response == 'Server received, But no response!!': - # with await message_lock: - # msg = await msg.channel.get_message(msg.id) - # await msg.edit(content=f'{msg.content}\n{server_name} Success') - # else: - # with await message_lock: - # msg = await msg.channel.get_message(msg.id) - # await msg.edit(content=f'{msg.content}\n{server_name} Failed') - # futures = [] - # rcon_connections: dict = await self.get_rcon_server_by_name(guild_config=ctx.guild_config, - # name='*') - # if rcon_connections: - # message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) - # msg = await ctx.send(f'Broadcasting "{message}" to all servers.') - # lock = asyncio.Lock() - # for server_name, server_con in rcon_connections.items(): - # futures.append(_broadcast(message=message, server_con=server_con, server_name=server_name, - # msg=msg, message_lock=lock)) - # self.bot.loop.create_task(asyncio.gather(*futures)) - # await ctx.message.add_reaction('✅') - # else: - # await ctx.send('There are no available servers for this guild.') - # else: - # await ctx.send('You must include a message with this command.') - # else: - # await ctx.send(f'You are not authorized to run this command.') - # - # @broadcast.command(name='server') - # @commands.guild_only() - # async def broadcast_server(self, ctx, server, *, message=None): - # """Sends a broadcast message to the specified server that is in the guild's config. - # The message will be prefixed with the Discord name of the person running the command. - # If has more than one word in it's name it will either need to be surrounded - # by double quotes or the words separated by _""" - # if await checks.is_rcon_admin(self.bot, ctx): - # if server is not None: - # server = server.replace('_', ' ').title() - # if message is not None: - # message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) - # server_con: arcon.ARKServer = await self.get_rcon_server_by_name( - # guild_config=ctx.guild_config, name=server - # ) - # if server_con: - # msg = await ctx.send(f'Broadcasting "{message}" to {server}.') - # response = await server_con.broadcast(message) - # if response == 'Server received, But no response!!': - # await msg.add_reaction(self.bot.unicode_emojis['y']) - # else: - # await msg.add_reaction(self.bot.unicode_emojis['x']) - # else: - # await ctx.send(f'{server} is not in the config for this guild') - # else: - # await ctx.send('You must include a message with this command.') - # else: - # await ctx.send('You must include a server with this command') - # else: - # await ctx.send(f'You are not authorized to run this command.') + + async def _broadcast(self, *, message: str, server_name: str, + msg: discord.Message, message_lock: asyncio.Lock): + suc = await self.bot.aio_session.get( + f'{self.bot.api_base}/rcon/{msg.guild.id}/{server_name}/broadcast/', + headers=self.bot.auth_header, + json={'message': message} + ) + if suc.status == 400: + resp = (await suc.json())['details'] + elif suc.status in (404, 408): + resp = (await suc.json())['details'] + else: + resp = '\n'.join(await suc.json()) + if resp == 'Server received, But no response!!': + with await message_lock: + msg = await msg.channel.get_message(msg.id) + await msg.edit(content=f'{msg.content}\n{server_name} Success') + else: + with await message_lock: + msg = await msg.channel.get_message(msg.id) + await msg.edit(content=f'{msg.content}\n{server_name} Failed') + + @commands.group(case_insensitive=True) + @commands.guild_only() + async def broadcast(self, ctx, server_name, *, message=None): + """Sends a broadcast message to all servers in the guild config. + The message will be prefixed with the Discord name of the person running the command. + Will print "Success" for each server once the broadcast is sent.""" + if await checks.is_rcon_admin(self.bot, ctx): + if message is not None: + resp = await self.bot.aio_session.get( + f'{self.bot.api_base}/rcon/{ctx.guild.id}/', + headers=self.bot.auth_header + ) + if resp.status != 200: + await ctx.send('There was a problem getting the servers for this guild.') + return + guild_servers = await resp.json() + # noinspection PyShadowingNames + + futures = [] + if server_name == 'all': + message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) + msg = await ctx.send(f'Broadcasting "{message}" to all servers.') + lock = asyncio.Lock() + for server in guild_servers: + futures.append(self._broadcast(message=message, server_name=server["name"], + msg=msg, message_lock=lock)) + else: + for server in guild_servers: + if server["name"].lower().replace(" ", "_") == server_name.lower(): + msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') + lock = asyncio.Lock() + futures.append(self._broadcast(message=message, server_name=server["name"], + msg=msg, message_lock=lock)) + break + else: + await ctx.send('That server is not configured in this guild.') + self.bot.loop.create_task(asyncio.gather(*futures)) + await ctx.message.add_reaction('✅') + + else: + await ctx.send('You must include a message with this command.') + else: + await ctx.send(f'You are not authorized to run this command.') # # @commands.command(aliases=['servers', 'list_servers']) # @commands.guild_only() From bbf454aabcb8441014d6cf36c76c434b0bb4f31b Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:14:09 -0800 Subject: [PATCH 07/13] Fix check for broadcast --- geeksbot/exts/rcon.py | 60 +++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index bd1736b..35d4c29 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -584,47 +584,45 @@ class Rcon(commands.Cog): @commands.group(case_insensitive=True) @commands.guild_only() + @checks.is_moderator() async def broadcast(self, ctx, server_name, *, message=None): """Sends a broadcast message to all servers in the guild config. The message will be prefixed with the Discord name of the person running the command. Will print "Success" for each server once the broadcast is sent.""" - if await checks.is_rcon_admin(self.bot, ctx): - if message is not None: - resp = await self.bot.aio_session.get( - f'{self.bot.api_base}/rcon/{ctx.guild.id}/', - headers=self.bot.auth_header - ) - if resp.status != 200: - await ctx.send('There was a problem getting the servers for this guild.') - return - guild_servers = await resp.json() - # noinspection PyShadowingNames + if message is not None: + resp = await self.bot.aio_session.get( + f'{self.bot.api_base}/rcon/{ctx.guild.id}/', + headers=self.bot.auth_header + ) + if resp.status != 200: + await ctx.send('There was a problem getting the servers for this guild.') + return + guild_servers = await resp.json() + # noinspection PyShadowingNames - futures = [] - if server_name == 'all': - message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) - msg = await ctx.send(f'Broadcasting "{message}" to all servers.') - lock = asyncio.Lock() - for server in guild_servers: + futures = [] + if server_name == 'all': + message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) + msg = await ctx.send(f'Broadcasting "{message}" to all servers.') + lock = asyncio.Lock() + for server in guild_servers: + futures.append(self._broadcast(message=message, server_name=server["name"], + msg=msg, message_lock=lock)) + else: + for server in guild_servers: + if server["name"].lower().replace(" ", "_") == server_name.lower(): + msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') + lock = asyncio.Lock() futures.append(self._broadcast(message=message, server_name=server["name"], msg=msg, message_lock=lock)) + break else: - for server in guild_servers: - if server["name"].lower().replace(" ", "_") == server_name.lower(): - msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') - lock = asyncio.Lock() - futures.append(self._broadcast(message=message, server_name=server["name"], - msg=msg, message_lock=lock)) - break - else: - await ctx.send('That server is not configured in this guild.') - self.bot.loop.create_task(asyncio.gather(*futures)) - await ctx.message.add_reaction('✅') + await ctx.send('That server is not configured in this guild.') + self.bot.loop.create_task(asyncio.gather(*futures)) + await ctx.message.add_reaction('✅') - else: - await ctx.send('You must include a message with this command.') else: - await ctx.send(f'You are not authorized to run this command.') + await ctx.send('You must include a message with this command.') # # @commands.command(aliases=['servers', 'list_servers']) # @commands.guild_only() From 3b77ba41bb52749b9f5da3c970b997304c7c37d0 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:27:37 -0800 Subject: [PATCH 08/13] Fix bug in broadcast --- geeksbot/exts/rcon.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 35d4c29..c68e772 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -601,6 +601,7 @@ class Rcon(commands.Cog): # noinspection PyShadowingNames futures = [] + error = False if server_name == 'all': message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) msg = await ctx.send(f'Broadcasting "{message}" to all servers.') @@ -618,8 +619,10 @@ class Rcon(commands.Cog): break else: await ctx.send('That server is not configured in this guild.') - self.bot.loop.create_task(asyncio.gather(*futures)) - await ctx.message.add_reaction('✅') + error = True + if not error: + await asyncio.gather(*futures, loop=self.bot.loop) + await ctx.message.add_reaction('✅') else: await ctx.send('You must include a message with this command.') From 9d762c942c6a1cc46b6b89df612a17289e539dea Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:32:37 -0800 Subject: [PATCH 09/13] Fix bug in broadcast --- geeksbot/exts/rcon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index c68e772..524ac2d 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -575,11 +575,11 @@ class Rcon(commands.Cog): resp = '\n'.join(await suc.json()) if resp == 'Server received, But no response!!': with await message_lock: - msg = await msg.channel.get_message(msg.id) + msg = await msg.channel.fetch_message(msg.id) await msg.edit(content=f'{msg.content}\n{server_name} Success') else: with await message_lock: - msg = await msg.channel.get_message(msg.id) + msg = await msg.channel.fetch_message(msg.id) await msg.edit(content=f'{msg.content}\n{server_name} Failed') @commands.group(case_insensitive=True) From 5979135131147b1e9c40a62cdc5d9e4604156676 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:34:31 -0800 Subject: [PATCH 10/13] Add resp to failed message --- geeksbot/exts/rcon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 524ac2d..5259569 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -580,7 +580,7 @@ class Rcon(commands.Cog): else: with await message_lock: msg = await msg.channel.fetch_message(msg.id) - await msg.edit(content=f'{msg.content}\n{server_name} Failed') + await msg.edit(content=f'{msg.content}\n{server_name} Failed\n{resp}') @commands.group(case_insensitive=True) @commands.guild_only() From 863ad75bfcecef8680e081393c206d9a9d2b5830 Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:40:33 -0800 Subject: [PATCH 11/13] Test resp in broadcast --- geeksbot/exts/rcon.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 5259569..915d881 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -560,13 +560,14 @@ class Rcon(commands.Cog): # else: # await ctx.send(f'You are not authorized to run this command.') - async def _broadcast(self, *, message: str, server_name: str, + async def _broadcast(self, *, ctx: discord.ext.commands.Context, message: str, server_name: str, msg: discord.Message, message_lock: asyncio.Lock): suc = await self.bot.aio_session.get( - f'{self.bot.api_base}/rcon/{msg.guild.id}/{server_name}/broadcast/', + f'{self.bot.api_base}/rcon/{ctx.guild.id}/{server_name}/broadcast/', headers=self.bot.auth_header, json={'message': message} ) + print(await suc.json()) if suc.status == 400: resp = (await suc.json())['details'] elif suc.status in (404, 408): @@ -607,14 +608,14 @@ class Rcon(commands.Cog): msg = await ctx.send(f'Broadcasting "{message}" to all servers.') lock = asyncio.Lock() for server in guild_servers: - futures.append(self._broadcast(message=message, server_name=server["name"], + futures.append(self._broadcast(ctx=ctx, message=message, server_name=server["name"], msg=msg, message_lock=lock)) else: for server in guild_servers: if server["name"].lower().replace(" ", "_") == server_name.lower(): msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') lock = asyncio.Lock() - futures.append(self._broadcast(message=message, server_name=server["name"], + futures.append(self._broadcast(ctx=ctx, message=message, server_name=server["name"], msg=msg, message_lock=lock)) break else: From b9fc97d18f78ae114bca0e1445c02006a155b6ed Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:44:12 -0800 Subject: [PATCH 12/13] Fix bug in broadcast --- geeksbot/exts/rcon.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 915d881..8e0ba55 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -560,10 +560,10 @@ class Rcon(commands.Cog): # else: # await ctx.send(f'You are not authorized to run this command.') - async def _broadcast(self, *, ctx: discord.ext.commands.Context, message: str, server_name: str, + async def _broadcast(self, *, message: str, server_name: str, msg: discord.Message, message_lock: asyncio.Lock): - suc = await self.bot.aio_session.get( - f'{self.bot.api_base}/rcon/{ctx.guild.id}/{server_name}/broadcast/', + suc = await self.bot.aio_session.post( + f'{self.bot.api_base}/rcon/{msg.guild.id}/{server_name}/broadcast/', headers=self.bot.auth_header, json={'message': message} ) @@ -608,14 +608,14 @@ class Rcon(commands.Cog): msg = await ctx.send(f'Broadcasting "{message}" to all servers.') lock = asyncio.Lock() for server in guild_servers: - futures.append(self._broadcast(ctx=ctx, message=message, server_name=server["name"], + futures.append(self._broadcast(message=message, server_name=server["name"], msg=msg, message_lock=lock)) else: for server in guild_servers: if server["name"].lower().replace(" ", "_") == server_name.lower(): msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') lock = asyncio.Lock() - futures.append(self._broadcast(ctx=ctx, message=message, server_name=server["name"], + futures.append(self._broadcast(message=message, server_name=server["name"], msg=msg, message_lock=lock)) break else: From 8a814ded0f276ab7f718ca97fdc7056b961a885a Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Tue, 18 Aug 2020 01:46:59 -0800 Subject: [PATCH 13/13] Add username to broadcast message --- geeksbot/exts/rcon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/geeksbot/exts/rcon.py b/geeksbot/exts/rcon.py index 8e0ba55..f9b84ba 100644 --- a/geeksbot/exts/rcon.py +++ b/geeksbot/exts/rcon.py @@ -613,6 +613,7 @@ class Rcon(commands.Cog): else: for server in guild_servers: if server["name"].lower().replace(" ", "_") == server_name.lower(): + message = ''.join(i for i in f'{ctx.author.display_name}: {message}' if ord(i) < 128) msg = await ctx.send(f'Broadcasting "{message}" to {server["name"]}.') lock = asyncio.Lock() futures.append(self._broadcast(message=message, server_name=server["name"],