diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/exts/admin.py b/exts/admin.py
index d22ceaf..e9c5c46 100644
--- a/exts/admin.py
+++ b/exts/admin.py
@@ -1,31 +1,28 @@
import discord
from discord.ext import commands
import json
-from srcds import rcon as rcon_con
-import time, logging, math
-from datetime import datetime, timedelta
-import asyncio, inspect
-import aiohttp, async_timeout
-from bs4 import BeautifulSoup as bs
-import traceback
-import os, sys
+import logging
+import inspect
+import os
from .imports import checks
config_dir = 'config/'
admin_id_file = 'admin_ids'
extension_dir = 'extensions'
owner_id = 351794468870946827
-embed_color = discord.Colour.from_rgb(49,107,111)
+embed_color = discord.Colour.from_rgb(49, 107, 111)
bot_config_file = 'bot_config.json'
invite_match = '(https?://)?(www.)?discord(app.com/(invite|oauth2)|.gg|.io)/[\w\d_\-?=&/]+'
admin_log = logging.getLogger('admin')
-class admin():
+
+class Admin:
def __init__(self, bot):
self.bot = bot
- def _get_config_string(self, guild_config):
+ @staticmethod
+ def _get_config_string(guild_config):
config_str = ''
for config in guild_config:
if isinstance(guild_config[config], dict):
@@ -75,17 +72,20 @@ class admin():
emoji_code = f''
else:
emoji_code = f'<:{emoji.name}:{emoji.id}>'
- if self.bot.con.all('select id from geeksbot_emojis where id = %(id)s', {'id':emoji.id}):
- self.bot.con.run("update geeksbot_emojis set id = %(id)s, name = %(name)s, code = %(emoji_code)s where name = %(name)s", {'name':emoji.name,'id':emoji.id,'emoji_code':emoji_code})
+ if self.bot.con.all('select id from geeksbot_emojis where id = %(id)s', {'id': emoji.id}):
+ self.bot.con.run("update geeksbot_emojis set id = %(id)s, name = %(name)s, code = %(emoji_code)s "
+ "where name = %(name)s",
+ {'name': emoji.name, 'id': emoji.id, 'emoji_code': emoji_code})
else:
- self.bot.con.run("insert into geeksbot_emojis(id,name,code) values (%(id)s,%(name)s,%(emoji_code)s)", {'name':emoji.name,'id':emoji.id,'emoji_code':emoji_code})
+ self.bot.con.run("insert into geeksbot_emojis(id,name,code) values (%(id)s,%(name)s,%(emoji_code)s)",
+ {'name': emoji.name, 'id': emoji.id, 'emoji_code': emoji_code})
await ctx.message.add_reaction('✅')
await ctx.send(f'Emojis have been updated in the database.')
@commands.command(hidden=True)
@commands.check(checks.is_guild_owner)
async def get_guild_config(self, ctx):
- config = self.bot.con.one('select * from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ config = self.bot.con.one('select * from guild_config where guild_id = %(id)s', {'id': ctx.guild.id})
configs = [str(config)[i:i+1990] for i in range(0, len(config), 1990)]
await ctx.message.author.send(f'The current config for the {ctx.guild.name} guild is:\n')
admin_log.info(configs)
@@ -95,25 +95,26 @@ class admin():
@commands.group(case_insensitive=True)
async def set(self, ctx):
- '''Run help set for more info'''
+ """Run help set for more info"""
pass
@commands.group(case_insensitive=True)
async def add(self, ctx):
- '''Run help set for more info'''
+ """Run help set for more info"""
pass
@commands.group(case_insensitive=True)
async def remove(self, ctx):
- '''Run help set for more info'''
+ """Run help set for more info"""
pass
@set.command(name='admin_chan', aliases=['ac', 'admin_chat', 'admin chat'])
- async def _admin_channel(self, ctx, channel:discord.TextChannel=None):
+ async def _admin_channel(self, ctx, channel: discord.TextChannel=None):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
- if channel != None:
- self.bot.con.run('update guild_config set admin_chat = %(chan)s where guild_id = %(id)s', {'id':ctx.guild.id, 'chan': channel.id})
+ if channel is not None:
+ self.bot.con.run('update guild_config set admin_chat = %(chan)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'chan': channel.id})
await ctx.send(f'{channel.name} is now set as the Admin Chat channel for this guild.')
@set.command(name='channel_lockdown', aliases=['lockdown', 'restrict_access', 'cl'])
@@ -121,14 +122,18 @@ class admin():
if ctx.guild:
if checks.is_admin(self.bot, ctx):
if str(config).lower() == 'true':
- if self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}) == []:
+ if self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}) is []:
await ctx.send('Please set at least one allowed channel before running this command.')
else:
- self.bot.con.run('update guild_config set channel_lockdown = True where guild_id = %(id)s', {'id':ctx.guild.id})
+ self.bot.con.run('update guild_config set channel_lockdown = True where guild_id = %(id)s',
+ {'id': ctx.guild.id})
await ctx.send('Channel Lockdown is now active.')
elif str(config).lower() == 'false':
- if self.bot.con.one('select channel_lockdown from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}):
- self.bot.con.run('update guild_config set channel_lockdown = False where guild_id = %(id)s', {'id':ctx.guild.id})
+ if self.bot.con.one('select channel_lockdown from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}):
+ self.bot.con.run('update guild_config set channel_lockdown = False where guild_id = %(id)s',
+ {'id': ctx.guild.id})
await ctx.send('Channel Lockdown has been deactivated.')
else:
await ctx.send('Channel Lockdown is already deactivated.')
@@ -137,32 +142,40 @@ class admin():
else:
await ctx.send('This command must be run from inside a guild.')
-
- @add.command(name='allowed_channels', aliases=['channel','ac'])
+ @add.command(name='allowed_channels', aliases=['channel', 'ac'])
async def _allowed_channels(self, ctx, *, channels):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
- channels = channels.lower().replace(' ','').split(',')
+ channels = channels.lower().replace(' ', '').split(',')
added = ''
for channel in channels:
chnl = discord.utils.get(ctx.guild.channels, name=channel)
- if chnl == None:
+ if chnl is None:
await ctx.send(f'{channel} is not a valid text channel in this guild.')
else:
admin_log.info('Chan found')
- if self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}):
- if chnl.id in json.loads(self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})):
+ if self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}):
+ if chnl.id in json.loads(self.bot.con.one('select allowed_channels from guild_config '
+ 'where guild_id = %(id)s',
+ {'id': ctx.guild.id})):
admin_log.info('Chan found in config')
await ctx.send(f'{channel} is already in the list of allowed channels. Skipping...')
else:
admin_log.info('Chan not found in config')
- allowed_channels = json.loads(self.bot.con.one('select allowed_channels from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})).append(chnl.id)
- self.bot.con.run('update guild_config set allowed_channels = %(channels)s where guild_id = %(id)s', {'id':ctx.guild.id, 'channels':allowed_channels})
+ allowed_channels = json.loads(self.bot.con.one('select allowed_channels from '
+ 'guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})).append(chnl.id)
+ self.bot.con.run('update guild_config set allowed_channels = %(channels)s '
+ 'where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'channels': allowed_channels})
added = f'{added}\n{channel}'
else:
admin_log.info('Chan not found in config')
allowed_channels = [chnl.id]
- self.bot.con.run('update guild_config set allowed_channels = %(channels)s where guild_id = %(id)s', {'id':ctx.guild.id, 'channels':allowed_channels})
+ self.bot.con.run('update guild_config set allowed_channels = %(channels)s '
+ 'where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'channels': allowed_channels})
added = f'{added}\n{channel}'
if added != '':
await ctx.send(f'The following channels have been added to the allowed channel list: {added}')
@@ -177,47 +190,51 @@ class admin():
async def view_code(self, ctx, code_name):
await ctx.send(f"```py\n{inspect.getsource(self.bot.get_command(code_name).callback)}\n```")
- @add.command(aliases=['prefix','p'])
+ @add.command(aliases=['prefix', 'p'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
async def add_prefix(self, ctx, *, prefix=None):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
- prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
- if prefix == None:
+ prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
+ if prefix is None:
await ctx.send(prefixes)
return
- elif prefixes == None:
- prefixes = prefix.replace(' ',',').split(',')
+ elif prefixes is None:
+ prefixes = prefix.replace(' ', ',').split(',')
else:
- for p in prefix.replace(' ',',').split(','):
+ for p in prefix.replace(' ', ',').split(','):
prefixes.append(p)
if len(prefixes) > 10:
await ctx.send(f'Only 10 prefixes are allowed per guild.\nPlease remove some before adding more.')
prefixes = prefixes[:10]
- self.bot.con.run('update guild_config set prefix = %(prefixes)s where guild_id = %(id)s', {'id':ctx.guild.id, 'prefixes':prefixes})
+ self.bot.con.run('update guild_config set prefix = %(prefixes)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'prefixes': prefixes})
await ctx.guild.me.edit(nick=f'[{prefixes[0]}] Geeksbot')
- await ctx.send(f"Updated. You currently have {len(prefixes)} {'prefix' if len(prefixes) == 1 else 'prefixes'} in your config.\n{', '.join(prefixes)}")
+ await ctx.send(f"Updated. You currently have {len(prefixes)} "
+ f"{'prefix' if len(prefixes) == 1 else 'prefixes'} "
+ f"in your config.\n{', '.join(prefixes)}")
else:
await ctx.send(f'You are not authorized to run this command.')
else:
await ctx.send(f'This command must be run from inside a guild.')
- @remove.command(aliases=['prefix','p'])
+ @remove.command(aliases=['prefix', 'p'])
@commands.cooldown(1, 5, type=commands.BucketType.guild)
async def remove_prefix(self, ctx, *, prefix=None):
if ctx.guild:
if checks.is_admin(self.bot, ctx):
- prefixes = []
- prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
found = 0
- if prefix == None:
+ if prefix is None:
await ctx.send(prefixes)
return
- elif prefixes == None or prefixes == []:
+ elif prefixes is None or prefixes == []:
await ctx.send('There are no custom prefixes setup for this guild.')
return
else:
- prefix = prefix.replace(' ',',').split(',')
+ prefix = prefix.replace(' ', ',').split(',')
for p in prefix:
if p in prefixes:
prefixes.remove(p)
@@ -225,9 +242,13 @@ class admin():
else:
await ctx.send(f'The prefix {p} is not in the config for this guild.')
if found:
- self.bot.con.run('update guild_config set prefix = %(prefixes)s where guild_id = %(id)s', {'id':ctx.guild.id, 'prefixes':prefixes})
- await ctx.guild.me.edit(nick=f'[{prefixes[0] if len(prefixes) != 0 else self.bot.default_prefix}] Geeksbot')
- await ctx.send(f"Updated. You currently have {len(prefixes)} {'prefix' if len(prefixes) == 1 else 'prefixes'} in your config.\n{', '.join(prefixes)}")
+ self.bot.con.run('update guild_config set prefix = %(prefixes)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'prefixes': prefixes})
+ await ctx.guild.me.edit(nick=f'[{prefixes[0] if len(prefixes) != 0 else self.bot.default_prefix}] '
+ f'Geeksbot')
+ await ctx.send(f"Updated. You currently have {len(prefixes)} "
+ f"{'prefix' if len(prefixes) == 1 else 'prefixes'} "
+ f"in your config.\n{', '.join(prefixes)}")
else:
await ctx.send(f'You are not authorized to run this command.')
else:
@@ -238,13 +259,15 @@ class admin():
@commands.check(checks.is_guild_owner)
async def _add_admin_role(self, ctx, role=None):
role = discord.utils.get(ctx.guild.roles, name=role)
- if role != None:
- roles = json.loads(self.bot.con.one('select admin_roles from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ if role is not None:
+ roles = json.loads(self.bot.con.one('select admin_roles from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}))
if role.name in roles:
await ctx.send(f'{role.name} is already registered as an admin role in this guild.')
else:
roles[role.name] = role.id
- self.bot.con.run('update guild_config set admin_roles = %(roles)s where guild_id = %(id)s', {'id':ctx.guild.id, 'roles':json.dumps(roles)})
+ self.bot.con.run('update guild_config set admin_roles = %(roles)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'roles': json.dumps(roles)})
await ctx.send(f'{role.name} has been added to the list of admin roles for this guild.')
else:
await ctx.send('You must include a role with this command.')
@@ -254,16 +277,19 @@ class admin():
@commands.check(checks.is_guild_owner)
async def _remove_admin_role(self, ctx, role=None):
role = discord.utils.get(ctx.guild.roles, name=role)
- if role != None:
- roles = json.loads(self.bot.con.one('select admin_roles from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ if role is not None:
+ roles = json.loads(self.bot.con.one('select admin_roles from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}))
if role.name in roles:
del roles[role.name]
- self.bot.con.run('update guild_config set admin_roles = %(roles)s where guild_id = %(id)s', {'id':ctx.guild.id, 'roles':roles})
+ self.bot.con.run('update guild_config set admin_roles = %(roles)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'roles': roles})
await ctx.send(f'{role.name} has been removed from the list of admin roles for this guild.')
else:
await ctx.send(f'{role.name} is not registered as an admin role in this guild.')
else:
await ctx.send('You must include a role with this command.')
+
def setup(bot):
- bot.add_cog(admin(bot))
+ bot.add_cog(Admin(bot))
diff --git a/exts/events.py b/exts/events.py
index 7e95739..b5b0694 100644
--- a/exts/events.py
+++ b/exts/events.py
@@ -1,10 +1,9 @@
import discord
-from discord.ext import commands
import logging
-from datetime import datetime, timedelta
-import json, asyncio, traceback
-import os, re
-from .imports import checks, utils
+from datetime import datetime
+import json
+import re
+from .imports import utils
config_dir = 'config/'
admin_id_file = 'admin_ids'
@@ -13,8 +12,8 @@ owner_id = 351794468870946827
guild_config_dir = 'guild_config/'
rcon_config_file = 'server_rcon_config'
dododex_url = 'http://www.dododex.com'
-embed_color = discord.Colour.from_rgb(49,107,111)
-red_color = discord.Colour.from_rgb(142,29,31)
+embed_color = discord.Colour.from_rgb(49, 107, 111)
+red_color = discord.Colour.from_rgb(142, 29, 31)
bot_config_file = 'bot_config'
default_guild_config_file = 'default_guild_config.json'
@@ -27,14 +26,16 @@ emojis = {
'crown': '👑',
'eggplant': '🍆',
'sob': '😭',
- 'trident':'🔱'
+ 'trident': '🔱'
}
-class bot_events():
+
+class BotEvents:
def __init__(self, bot):
self.bot = bot
- def _get_config_string(self, guild_config):
+ @staticmethod
+ def _get_config_string(guild_config):
config_str = ''
for config in guild_config:
if isinstance(guild_config[config], dict):
@@ -50,7 +51,8 @@ class bot_events():
return config_str
async def on_raw_message_delete(self, msg_id, chan_id):
- self.bot.con.run('update messages set deleted_at = %(time)s where id = %(id)s', {'time': datetime.utcnow(), 'id': msg_id})
+ self.bot.con.run('update messages set deleted_at = %(time)s where id = %(id)s',
+ {'time': datetime.utcnow(), 'id': msg_id})
async def on_raw_bulk_message_delete(self, msg_ids, chan_id):
sql = ''
@@ -66,11 +68,15 @@ class bot_events():
# await ctx.channel.send(f'{ctx.author.mention} You have been healed.')
else:
await ctx.add_reaction(self.bot.infected[ctx.author][0])
- except:
+ except Exception:
pass
- sql = 'insert into messages (id, tts, type, content, embeds, channel, mention_everyone, mentions, channel_mentions, role_mentions, webhook, attachments, pinned, reactions, guild, created_at, system_content, author) \
- values (%(id)s, %(tts)s, %(type)s, %(content)s, %(embeds)s, %(channel)s, %(mention_everyone)s, %(mentions)s, %(channel_mentions)s, %(role_mentions)s, %(webhook)s, %(attachments)s, %(pinned)s, %(reactions)s, %(guild)s, %(created_at)s, %(system_content)s, %(author)s)'
- msg_data = {}
+ sql = 'insert into messages (id, tts, type, content, embeds, channel, mention_everyone, mentions,\
+ channel_mentions, role_mentions, webhook, attachments, pinned, reactions, guild, created_at,\
+ system_content, author) \
+ values (%(id)s, %(tts)s, %(type)s, %(content)s, %(embeds)s, %(channel)s, %(mention_everyone)s, %(mentions)s,\
+ %(channel_mentions)s, %(role_mentions)s, %(webhook)s, %(attachments)s, %(pinned)s, %(reactions)s, %(guild)s,\
+ %(created_at)s, %(system_content)s, %(author)s)'
+ msg_data = dict()
msg_data['id'] = ctx.id
msg_data['tts'] = ctx.tts
msg_data['type'] = str(ctx.type)
@@ -82,7 +88,8 @@ class bot_events():
msg_data['channel_mentions'] = [channel.id for channel in ctx.channel_mentions]
msg_data['role_mentions'] = [role.id for role in ctx.role_mentions]
msg_data['webhook'] = ctx.webhook_id
- msg_data['attachments'] = [json.dumps({'id': a.id, 'size': a.size, 'height': a.height, 'width': a.width, 'filename': a.filename, 'url': a.url}) for a in ctx.attachments]
+ msg_data['attachments'] = [json.dumps({'id': a.id, 'size': a.size, 'height': a.height, 'width': a.width,
+ 'filename': a.filename, 'url': a.url}) for a in ctx.attachments]
msg_data['pinned'] = ctx.pinned
msg_data['guild'] = ctx.guild.id
msg_data['created_at'] = ctx.created_at
@@ -94,7 +101,8 @@ class bot_events():
if ctx.author != ctx.guild.me:
if self.bot.con.one(f"select pg_filter from guild_config where guild_id = {ctx.guild.id}"):
profane = 0
- for word in self.bot.con.one('select profane_words from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}):
+ for word in self.bot.con.one('select profane_words from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id}):
word = word.strip()
if word in ctx.content.lower():
events_log.info(f'Found non PG word {word}')
@@ -112,32 +120,37 @@ class bot_events():
await hook.send(ctx.content, username=username, avatar_url=ctx.author.avatar_url)
await hook.delete()
- async def on_reaction_add(self,react,user):
+ async def on_reaction_add(self, react, user):
if react.emoji == emojis['poop'] and react.message.author.id == 351794468870946827:
- await react.message.remove_reaction(emojis['poop'],user)
+ await react.message.remove_reaction(emojis['poop'], user)
await react.message.channel.send(f"You can't Poop on my Owner {user.mention} :P")
if react.emoji == emojis['poop'] and react.message.author.id == 396588996706304010:
- await react.message.remove_reaction(emojis['poop'],user)
+ await react.message.remove_reaction(emojis['poop'], user)
await react.message.channel.send(f"You can't Poop on me {user.mention} :P")
reactions = react.message.reactions
reacts = [json.dumps({'emoji': r.emoji, 'count': r.count}) for r in reactions]
- self.bot.con.run('update messages set reactions = %(reacts)s where id = {react.message.id}', {'reacts': reacts})
+ self.bot.con.run('update messages set reactions = %(reacts)s where id = %(id)s',
+ {'id': react.message.id, 'reacts': reacts})
async def on_message_edit(self, before, ctx):
- previous_content = self.bot.con.one('select previous_content from messages where id = {ctx.id}')
+ previous_content = self.bot.con.one('select previous_content from messages where id = %(id)s', {'id': ctx.id})
if previous_content:
previous_content.append(before.content)
else:
previous_content = [before.content]
- previous_embeds = self.bot.con.one('select previous_embeds from messages where id = {ctx.id}')
+ previous_embeds = self.bot.con.one('select previous_embeds from messages where id = %(id)s', {'id': ctx.id})
if previous_embeds:
previous_embeds.append([json.dumps(e.to_dict()) for e in before.embeds])
else:
previous_embeds = [[json.dumps(e.to_dict()) for e in before.embeds]]
- sql = 'update messages set (edited_at, previous_content, previous_embeds, tts, type, content, embeds, channel, mention_everyone, mentions, channel_mentions, role_mentions, webhook, attachments, pinned, reactions, guild, created_at, system_content, author) \
- = (%(edited_at)s, %(previous_content)s, %(previous_embeds)s, %(tts)s, %(type)s, %(content)s, %(embeds)s, %(channel)s, %(mention_everyone)s, %(mentions)s, %(channel_mentions)s, %(role_mentions)s, %(webhook)s, %(attachments)s, %(pinned)s, %(reactions)s, %(guild)s, %(created_at)s, %(system_content)s, %(author)s) \
- where id = %(id)s'
- msg_data = {}
+ sql = 'update messages set (edited_at, previous_content, previous_embeds, tts, type, content,\
+ embeds, channel, mention_everyone, mentions, channel_mentions, role_mentions, webhook,\
+ attachments, pinned, reactions, guild, created_at, system_content, author) \
+ = (%(edited_at)s, %(previous_content)s, %(previous_embeds)s, %(tts)s, %(type)s, %(content)s,\
+ %(embeds)s, %(channel)s, %(mention_everyone)s, %(mentions)s, %(channel_mentions)s, %(role_mentions)s,\
+ %(webhook)s, %(attachments)s, %(pinned)s, %(reactions)s, %(guild)s, %(created_at)s, %(system_content)s,\
+ %(author)s) where id = %(id)s'
+ msg_data = dict()
msg_data['id'] = ctx.id
msg_data['tts'] = ctx.tts
msg_data['type'] = str(ctx.type)
@@ -161,80 +174,87 @@ class bot_events():
msg_data['edited_at'] = datetime.utcnow()
self.bot.con.run(sql, msg_data)
- async def on_command_error(self,ctx,error):
+ @staticmethod
+ async def on_command_error(ctx, error):
if ctx.channel.id == 418452585683484680 and type(error) == discord.ext.commands.errors.CommandNotFound:
return
for page in utils.paginate(error):
await ctx.send(page)
async def on_guild_join(self, guild):
- with open(f"{config_dir}{default_guild_config_file}",'r') as file:
+ with open(f"{config_dir}{default_guild_config_file}", 'r') as file:
default_config = json.loads(file.read())
admin_role = guild.role_hierarchy[0]
default_config['admin_roles'] = {admin_role.name: admin_role.id}
- default_config['name'] = guild.name.replace("'","\\'")
+ default_config['name'] = guild.name.replace("'", "\\'")
default_config['guild_id'] = guild.id
events_log.info(default_config)
- self.bot.con.run("insert into guild_config(guild_id,guild_name,admin_roles,rcon_enabled,channel_lockdown,raid_status,pg_filter,patreon_enabled,referral_enabled)\
- values (%(guild_id)s,%(name)s,%(admin_roles)s,%(rcon_enabled)s,%(channel_lockdown)s,%(raid_status)s,%(pg_filter)s,%(patreon_enabled)s,%(referral_enabled)s)",
- {'guild_id': default_config['guild_id'],
- 'name': default_config['name'],
- 'admin_roles': json.dumps(default_config['admin_roles']),
- 'rcon_enabled': default_config['rcon_enabled'],
- 'channel_lockdown': default_config['channel_lockdown'],
- 'raid_status': default_config['raid_status'],
- 'pg_filter': default_config['pg_filter'],
- 'patreon_enabled': default_config['patreon_enabled'],
- 'referral_enabled': default_config['referral_enabled']
- })
+ self.bot.con.run("insert into guild_config(guild_id, guild_name, admin_roles, rcon_enabled, channel_lockdown,\
+ raid_status, pg_filter, patreon_enabled, referral_enabled)\
+ values (%(guild_id)s, %(name)s, %(admin_roles)s, %(rcon_enabled)s, %(channel_lockdown)s,\
+ %(raid_status)s, %(pg_filter)s, %(patreon_enabled)s, %(referral_enabled)s)",
+ {'guild_id': default_config['guild_id'],
+ 'name': default_config['name'],
+ 'admin_roles': json.dumps(default_config['admin_roles']),
+ 'rcon_enabled': default_config['rcon_enabled'],
+ 'channel_lockdown': default_config['channel_lockdown'],
+ 'raid_status': default_config['raid_status'],
+ 'pg_filter': default_config['pg_filter'],
+ 'patreon_enabled': default_config['patreon_enabled'],
+ 'referral_enabled': default_config['referral_enabled']
+ })
events_log.info(f'Entry Created for {guild.name}')
- config_str = self._get_config_string(default_config)
- self.bot.recent_msgs[guild.id] = deque(maxlen=50)
await guild.me.edit(nick='[g$] Geeksbot')
- # await guild.owner.send(f'Geeksbot has joined your guild {guild.name}!\nYour current configuration is:\n```{config_str}```\nEnjoy!')
async def on_guild_remove(self, guild):
- self.bot.con.run(f'delete from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ self.bot.con.run(f'delete from guild_config where guild_id = %(id)s', {'id': guild.id})
events_log.info(f'Left the {guild.name} guild.')
async def on_member_join(self, member):
events_log.info(f'Member joined: {member.name} {member.id} Guild: {member.guild.name} {member.guild.id}')
- join_chan = self.bot.con.one('select join_leave_chat from guild_config where guild_id = %(id)s', {'id':member.guild.id})
+ join_chan = self.bot.con.one('select join_leave_chat from guild_config where guild_id = %(id)s',
+ {'id': member.guild.id})
if join_chan:
- em = discord.Embed( style='rich',
- color=embed_color
- )
+ em = discord.Embed(style='rich',
+ color=embed_color
+ )
em.set_thumbnail(url=member.avatar_url)
em.add_field(name=f'Welcome {member.name}#{member.discriminator}', value=member.id, inline=False)
- em.add_field(name='User created on:', value=member.created_at.strftime('%Y-%m-%d at %H:%M:%S GMT'), inline=True)
+ em.add_field(name='User created on:', value=member.created_at.strftime('%Y-%m-%d at %H:%M:%S GMT'),
+ inline=True)
em.add_field(name='Bot:', value=str(member.bot))
- em.set_footer(text=f"{member.guild.name} | {member.joined_at.strftime('%Y-%m-%d at %H:%M:%S GMT')}", icon_url=member.guild.icon_url)
+ em.set_footer(text=f"{member.guild.name} | {member.joined_at.strftime('%Y-%m-%d at %H:%M:%S GMT')}",
+ icon_url=member.guild.icon_url)
await discord.utils.get(member.guild.channels, id=join_chan).send(embed=em)
mem_data = {'id': member.id,
'name': member.name,
'discriminator': member.discriminator,
'bot': member.bot
}
- mem = self.bot.con.one('select guilds,nicks from user_data where id = {member.id}')
+ mem = self.bot.con.one('select guilds,nicks from user_data where id = %(id)s', {'id': member.id})
if mem:
mem[1].append(json.dumps({member.guild.id: member.display_name}))
mem[0].append(member.guild.id)
mem_data['nicks'] = mem[1]
mem_data['guilds'] = mem[0]
- self.bot.con.run('update user_data set (name, discriminator, bot, nicks, guilds) = (%(name)s, %(discriminator)s, %(bot)s, %(nicks)s, %(guilds)s) where id = %(id)s',mem_data)
+ self.bot.con.run('update user_data set (name, discriminator, bot, nicks, guilds) =\
+ (%(name)s, %(discriminator)s, %(bot)s, %(nicks)s, %(guilds)s) where\
+ id = %(id)s', mem_data)
else:
mem_data['nicks'] = [json.dumps({member.guild.id: member.display_name})]
mem_data['guilds'] = [member.guild.id]
- self.bot.con.run('insert into user_data (id, name, discriminator, bot, nicks, guilds) values (%(id)s, %(name)s, %(discriminator)s, %(bot)s, %(nicks)s, %(guilds)s)',mem_data)
+ self.bot.con.run('insert into user_data (id, name, discriminator, bot, nicks, guilds) values\
+ (%(id)s, %(name)s, %(discriminator)s, %(bot)s, %(nicks)s, %(guilds)s)', mem_data)
async def on_member_remove(self, member):
leave_time = datetime.utcnow()
events_log.info(f'Member left: {member.name} {member.id} Guild: {member.guild.name} {member.guild.id}')
- join_chan = self.bot.con.one('select join_leave_chat from guild_config where guild_id = %(id)s', {'id':member.guild.id})
+ join_chan = self.bot.con.one('select join_leave_chat from guild_config where guild_id = %(id)s',
+ {'id': member.guild.id})
if join_chan:
- em = discord.Embed( style='rich',
- color=red_color
- )
+ em = discord.Embed(style='rich',
+ color=red_color
+ )
em.set_thumbnail(url=member.avatar_url)
em.add_field(name=f'RIP {member.name}#{member.discriminator}', value=member.id, inline=False)
join_time = member.joined_at
@@ -245,11 +265,15 @@ class bot_events():
days, remainder = divmod(total_time.total_seconds(), 86400)
hours, remainder = divmod(remainder, 3600)
minutes, seconds = divmod(remainder, 60)
- time_str = f"{str(int(days)) + ' days, ' if days != 0 else ''}{str(int(hours)) + ' hours, ' if hours != 0 else ''}{str(int(minutes)) + ' minutes and ' if minutes != 0 else ''}{int(seconds)} seconds"
+ days_str = str(int(days)) + ' days, ' if days != 0 else ''
+ hours_str = str(int(hours)) + ' hours, ' if hours != 0 else ''
+ minutes_str = str(int(minutes)) + ' minutes and ' if minutes != 0 else ''
+ time_str = f"{days_str}{hours_str}{minutes_str}{int(seconds)} seconds"
em.add_field(name='Total time in Guild:', value=time_str, inline=False)
- em.set_footer(text=f"{member.guild.name} | {datetime.utcnow().strftime('%Y-%m-%d at %H:%M:%S GMT')}", icon_url=member.guild.icon_url)
+ em.set_footer(text=f"{member.guild.name} | {datetime.utcnow().strftime('%Y-%m-%d at %H:%M:%S GMT')}",
+ icon_url=member.guild.icon_url)
await discord.utils.get(member.guild.channels, id=join_chan).send(embed=em)
def setup(bot):
- bot.add_cog(bot_events(bot))
+ bot.add_cog(BotEvents(bot))
diff --git a/exts/fun.py b/exts/fun.py
index fa4380b..2d087c2 100644
--- a/exts/fun.py
+++ b/exts/fun.py
@@ -2,8 +2,8 @@ import discord
from discord.ext import commands
import logging
from datetime import datetime
-import json, asyncio
-import os, re, aiohttp, async_timeout
+import asyncio
+import youtube_dl
config_dir = 'config/'
admin_id_file = 'admin_ids'
@@ -12,7 +12,7 @@ owner_id = 351794468870946827
guild_config_dir = 'guild_config/'
rcon_config_file = 'server_rcon_config'
dododex_url = 'http://www.dododex.com'
-embed_color = discord.Colour.from_rgb(49,107,111)
+embed_color = discord.Colour.from_rgb(49, 107, 111)
bot_config_file = 'bot_config'
default_guild_config_file = 'default_guild_config.json'
emoji_guild = 408524303164899338
@@ -25,26 +25,29 @@ emojis = {
'poop': '💩'
}
-class fun():
+
+class Fun:
def __init__(self, bot):
self.bot = bot
@commands.command()
@commands.cooldown(1, 30, type=commands.BucketType.user)
- async def infect(self, ctx, member:discord.Member, emoji):
+ async def infect(self, ctx, member: discord.Member, emoji):
if member.id == self.bot.user.id and ctx.author.id != owner_id:
await ctx.send(f'You rolled a Critical Fail...\nInfection bounces off and rebounds on the attacker.')
member = ctx.author
if member in self.bot.infected:
- await ctx.send(f'{member.display_name} is already infected. Please wait until they are healed before infecting them again...')
+ await ctx.send(f'{member.display_name} is already infected. '
+ f'Please wait until they are healed before infecting them again...')
else:
- emoji = self.bot.get_emoji(int(emoji.split(':')[2].strip('>'))) if '<:' in emoji or ''))) if '<:' in emoji \
+ or '')
+ await ctx.send(f'{ctx.author.mention} '
+ f'You slap yourself in the face with a large trout <:trout:408543365085397013>')
else:
- await ctx.send(f'{ctx.author.display_name} slaps {member.mention} around a bit with a large trout <:trout:408543365085397013>')
+ await ctx.send(f'{ctx.author.display_name} slaps '
+ f'{member.mention} around a bit with a large trout <:trout:408543365085397013>')
- def get_factorial(self,number):
+ @staticmethod
+ def get_factorial(number):
a = 1
- for i in range(1,int(number)):
+ for i in range(1, int(number)):
a = a * (i + 1)
return a
@@ -103,8 +108,11 @@ class fun():
self.bot.voice_chans[ctx.author.voice.channel.name] = await ctx.author.voice.channel.connect()
asyncio.sleep(5)
if url:
- import youtube_dl
- opts = {"format": 'webm[abr>0]/bestaudio/best',"ignoreerrors": True,"default_search": "auto","source_address": "0.0.0.0",'quiet': True}
+ opts = {"format": 'webm[abr>0]/bestaudio/best',
+ "ignoreerrors": True,
+ "default_search": "auto",
+ "source_address": "0.0.0.0",
+ 'quiet': True}
ydl = youtube_dl.YoutubeDL(opts)
info = ydl.extract_info(url, download=False)
self.bot.player = discord.FFmpegPCMAudio(info['url'])
@@ -135,9 +143,9 @@ class fun():
@commands.command(hidden=True)
@commands.is_owner()
- async def volume(self, ctx, volume:float):
+ async def volume(self, ctx, volume: float):
self.bot.player.volume = volume
def setup(bot):
- bot.add_cog(fun(bot))
+ bot.add_cog(Fun(bot))
diff --git a/exts/git.py b/exts/git.py
index 4f06f32..5fcc10e 100644
--- a/exts/git.py
+++ b/exts/git.py
@@ -1,33 +1,36 @@
import discord
from discord.ext import commands
-import os, logging
+import logging
from .imports.utils import paginate, run_command
import asyncio
owner_id = 351794468870946827
-embed_color = discord.Colour.from_rgb(49,107,111)
+embed_color = discord.Colour.from_rgb(49, 107, 111)
git_log = logging.getLogger('git')
-class Git():
+
+class Git:
def __init__(self, bot):
self.bot = bot
@commands.group(case_insensitive=True)
async def git(self, ctx):
- '''Run help set for more info'''
+ """Run help git for more info"""
pass
@git.command()
@commands.is_owner()
async def pull(self, ctx):
- em = discord.Embed( style='rich',
- title=f'Git Pull',
- color=embed_color)
+ em = discord.Embed(style='rich',
+ title=f'Git Pull',
+ color=embed_color)
em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}')
- result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git fetch --all')),120) + '\n'
- result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git reset --hard origin/master')),120) + '\n\n'
- result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | sed "s/.*@.*[.].*/ /g"')),10)
+ result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git fetch --all')), 120) + '\n'
+ result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git reset --hard '
+ 'origin/master')), 120) + '\n\n'
+ result += await asyncio.wait_for(self.bot.loop.create_task(run_command('git show --stat | '
+ 'sed "s/.*@.*[.].*/ /g"')), 10)
results = paginate(result, maxlen=1014)
for page in results[:5]:
em.add_field(name='', value=f'{page}')
@@ -36,11 +39,11 @@ class Git():
@git.command()
@commands.is_owner()
async def status(self, ctx):
- em = discord.Embed( style='rich',
- title=f'Git Pull',
- color=embed_color)
+ em = discord.Embed(style='rich',
+ title=f'Git Pull',
+ color=embed_color)
em.set_thumbnail(url=f'{ctx.guild.me.avatar_url}')
- result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git status')),10)
+ result = await asyncio.wait_for(self.bot.loop.create_task(run_command('git status')), 10)
results = paginate(result, maxlen=1014)
for page in results[:5]:
em.add_field(name='', value=f'{page}')
diff --git a/exts/imports/checks.py b/exts/imports/checks.py
index b6044b0..30de021 100644
--- a/exts/imports/checks.py
+++ b/exts/imports/checks.py
@@ -1,50 +1,60 @@
-import discord, json, asyncio
+import discord
+import json
from . import utils
owner_id = 351794468870946827
-
def check_admin_role(bot, ctx, member):
- admin_roles = json.loads(bot.con.one(f"select admin_roles from guild_config where guild_id = {ctx.guild.id}"))
+ admin_roles = json.loads(bot.con.one(f"select admin_roles from guild_config where guild_id = %(id)s",
+ {'id': ctx.guild.id}))
for role in admin_roles:
if discord.utils.get(ctx.guild.roles, id=admin_roles[role]) in member.roles:
return True
return member.id == ctx.guild.owner.id or member.id == owner_id
+
def check_rcon_role(bot, ctx, member):
- rcon_admin_roles = json.loads(bot.con.one(f"select rcon_admin_roles from guild_config where guild_id = {ctx.guild.id}"))
+ rcon_admin_roles = json.loads(bot.con.one("select rcon_admin_roles from guild_config where guild_id = %(id)s",
+ {'id': ctx.guild.id}))
for role in rcon_admin_roles:
if discord.utils.get(ctx.guild.roles, id=rcon_admin_roles[role]) in member.roles:
return True
return member.id == ctx.guild.owner.id or member.id == owner_id
+
def is_admin(bot, ctx):
- admin_roles = json.loads(bot.con.one(f"select admin_roles from guild_config where guild_id = {ctx.guild.id}"))
+ admin_roles = json.loads(bot.con.one("select admin_roles from guild_config where guild_id = %(id)s",
+ {'id': ctx.guild.id}))
for role in admin_roles:
if discord.utils.get(ctx.guild.roles, id=admin_roles[role]) in ctx.message.author.roles:
return True
return ctx.message.author.id == ctx.guild.owner.id or ctx.message.author.id == owner_id
+
def is_guild_owner(ctx):
if ctx.guild:
return ctx.message.author.id == ctx.guild.owner.id or ctx.message.author.id == owner_id
return False
+
def is_rcon_admin(bot, ctx):
- rcon_admin_roles = json.loads(bot.con.one(f"select rcon_admin_roles from guild_config where guild_id = {ctx.guild.id}"))
+ rcon_admin_roles = json.loads(bot.con.one("select rcon_admin_roles from guild_config where guild_id = %(id)s",
+ {'id': ctx.guild.id}))
for role in rcon_admin_roles:
if discord.utils.get(ctx.guild.roles, id=rcon_admin_roles[role]) in ctx.message.author.roles:
return True
return ctx.message.author.id == ctx.guild.owner.id or ctx.message.author.id == owner_id
+
def is_restricted_chan(ctx):
if ctx.guild:
- if ctx.channel.overwrites_for(ctx.guild.default_role).read_messages == False:
+ if ctx.channel.overwrites_for(ctx.guild.default_role).read_messages is False:
return True
return False
return False
+
async def is_spam(bot, ctx):
max_rep = 5
rep_time = 20
@@ -56,9 +66,10 @@ async def is_spam(bot, ctx):
if msg['author'] == ctx.author:
if msg['time'] > ctx.message.created_at.timestamp() - spam_time:
spam_check += 1
- if msg['content'].lower() == ctx.content.lower() and msg['time'] > ctx.message.created_at.timestamp() - rep_time:
+ if msg['content'].lower() == ctx.content.lower() \
+ and msg['time'] > ctx.message.created_at.timestamp() - rep_time:
msg_check += 1
if spam_check == spam_rep - 1 or msg_check == max_rep - 1:
await utils.mute(bot, ctx, admin=1, member=ctx.author.id)
return True
- return False
\ No newline at end of file
+ return False
diff --git a/exts/imports/utils.py b/exts/imports/utils.py
index 76d0ac2..ace473b 100644
--- a/exts/imports/utils.py
+++ b/exts/imports/utils.py
@@ -1,5 +1,7 @@
from io import StringIO
-import sys, asyncio
+import sys
+import asyncio
+import discord
from discord.ext.commands.formatter import Paginator
from . import checks
@@ -9,20 +11,23 @@ class Capturing(list):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
+
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
del self._stringio # free up some memory
sys.stdout = self._stdout
+
async def mute(bot, ctx, admin=0, member_id=None):
- mute_role = self.bot.con.one(f'select muted_role from guild_config where guild_id = {ctx.guild.id}')
- if muted_role:
+ mute_role = bot.con.one(f'select muted_role from guild_config where guild_id = {ctx.guild.id}')
+ if mute_role:
if admin or checks.is_admin(bot, ctx):
if ctx.guild.me.guild_permissions.manage_roles:
- if member:
+ if member_id:
ctx.guild.get_member(member_id).edit(roles=[discord.utils.get(ctx.guild.roles, id=mute_role)])
-def to_list_of_str(items, out:list=[], level=1, recurse=0):
+
+def to_list_of_str(items, out: list=list(), level=1, recurse=0):
def rec_loop(item, key, out, level):
quote = '"'
if type(item) == list:
@@ -40,7 +45,7 @@ def to_list_of_str(items, out:list=[], level=1, recurse=0):
if type(items) == list:
if not recurse:
- out = []
+ out = list()
out.append('[')
for item in items:
rec_loop(item, None, out, level)
@@ -48,7 +53,7 @@ def to_list_of_str(items, out:list=[], level=1, recurse=0):
out.append(']')
elif type(items) == dict:
if not recurse:
- out = []
+ out = list()
out.append('{')
for key in items:
rec_loop(items[key], key, out, level)
@@ -57,8 +62,8 @@ def to_list_of_str(items, out:list=[], level=1, recurse=0):
return out
+
def paginate(text, maxlen=1990):
- data = []
paginator = Paginator(prefix='```py', max_size=maxlen+10)
if type(text) == list:
data = to_list_of_str(text)
@@ -75,6 +80,7 @@ def paginate(text, maxlen=1990):
paginator.add_line(line)
return paginator.pages
+
async def run_command(args):
# Create subprocess
process = await asyncio.create_subprocess_shell(
diff --git a/exts/patreon.py b/exts/patreon.py
index 731ccd3..1e1e4d2 100644
--- a/exts/patreon.py
+++ b/exts/patreon.py
@@ -7,22 +7,25 @@ config_dir = 'config'
extension_dir = 'extensions'
owner_id = 351794468870946827
-class patreon():
+
+class Patreon:
def __init__(self, bot):
self.bot = bot
- @commands.command(aliases=['get_patreon','patreon'])
+ @commands.command(aliases=['get_patreon', 'patreon'])
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def get_patreon_links(self, ctx, target: discord.Member=None):
- 'Prints Patreon information for creators on the server.'
- if self.bot.con.one('select patreon_enabled from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}):
- patreon_info = self.bot.con.one('select patreon_message,patreon_links from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
- message = patreon_info[0].replace('\\n','\n')
+ """Prints Patreon information for creators on the server."""
+ if self.bot.con.one('select patreon_enabled from guild_config where guild_id = %(id)s', {'id': ctx.guild.id}):
+ patreon_info = self.bot.con.one('select patreon_message,patreon_links\
+ from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
+ message = patreon_info[0].replace('\\n', '\n')
patreon_links = json.loads(patreon_info[1])
for key in patreon_links:
message = message + '\n{0}: {1}'.format(key, patreon_links[key])
- if target == None:
+ if target is None:
await ctx.send(message)
else:
await ctx.send('{0}\n{1}'.format(target.mention, message))
@@ -32,11 +35,13 @@ class patreon():
@commands.command(aliases=['patreon_message'])
async def set_patreon_message(self, ctx, message):
if checks.is_admin(self.bot, ctx):
- patreon_message = self.bot.con.one('select patreon_message from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ patreon_message = self.bot.con.one('select patreon_message from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
if message == patreon_message:
await ctx.send('That is already the current message for this guild.')
else:
- self.bot.con.run('update guild_config set patreon_message = %(message)s where guild_id = %(id)s', {'id':ctx.guild.id, 'message': message})
+ self.bot.con.run('update guild_config set patreon_message = %(message)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'message': message})
await ctx.send(f'The patreon message for this guild has been set to:\n{message}')
else:
await ctx.send(f'You are not authorized to run this command.')
@@ -44,7 +49,8 @@ class patreon():
@commands.command(aliases=['add_patreon', 'set_patreon'])
async def add_patreon_info(self, ctx, name, url):
if checks.is_admin(self.bot, ctx):
- patreon_info = self.bot.con.one('select patreon_links from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ patreon_info = self.bot.con.one('select patreon_links from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
patreon_links = {}
update = 0
if patreon_info:
@@ -52,21 +58,24 @@ class patreon():
if name in patreon_links:
update = 1
patreon_links[name] = url
- self.bot.con.run('update guild_config set patreon_links = %(links)s where guild_id = %(id)s', {'id':ctx.guild.id, 'links': json.dumps(patreon_links)})
- await ctx.send(f"The Patreon link for {name} has been {'updated to the new url.' if update else'added to the config for this guild.'}")
+ self.bot.con.run('update guild_config set patreon_links = %(links)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'links': json.dumps(patreon_links)})
+ await ctx.send(f"The Patreon link for {name} has been "
+ f"{'updated to the new url.' if update else'added to the config for this guild.'}")
else:
await ctx.send(f'You are not authorized to run this command.')
@commands.command(aliases=['remove_patreon'])
async def remove_patreon_info(self, ctx, name):
if checks.is_admin(self.bot, ctx):
- patreon_info = self.bot.con.one('select patreon_links from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
- patreon_links = {}
+ patreon_info = self.bot.con.one('select patreon_links from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
if patreon_info:
patreon_links = json.loads(patreon_info)
if name in patreon_links:
del patreon_links[name]
- self.bot.con.run('update guild_config set patreon_links = %(links)s where guild_id = %(id)s', {'id':ctx.guild.id, 'links': json.dumps(patreon_links)})
+ self.bot.con.run('update guild_config set patreon_links = %(links)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'links': json.dumps(patreon_links)})
await ctx.send(f'The Patreon link for {name} has been removed from the config for this guild.')
return
else:
@@ -77,36 +86,41 @@ class patreon():
await ctx.send(f'You are not authorized to run this command.')
@commands.command()
- async def enable_patreon(self, ctx, state:bool=True):
+ async def enable_patreon(self, ctx, state: bool=True):
if checks.is_admin(self.bot, ctx):
- patreon_status = self.bot.con.one('select patreon_enabled from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ patreon_status = self.bot.con.one('select patreon_enabled from guild_config where guild_id = %(id)s',
+ {'id': ctx.guild.id})
if patreon_status and state:
await ctx.send('Patreon is already enabled for this guild.')
elif patreon_status and not state:
- self.bot.con.run('update guild_config set patreon_enabled = %(state)s where guild_id = %(id)s', {'id':ctx.guild.id, 'state': state})
+ self.bot.con.run('update guild_config set patreon_enabled = %(state)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'state': state})
await ctx.send('Patreon has been disabled for this guild.')
elif not patreon_status and state:
- self.bot.con.run('update guild_config set patreon_enabled = %(state)s where guild_id = %(id)s', {'id':ctx.guild.id, 'state': state})
+ self.bot.con.run('update guild_config set patreon_enabled = %(state)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'state': state})
await ctx.send('Patreon has been enabled for this guild.')
elif not patreon_status and not state:
await ctx.send('Patreon is already disabled for this guild.')
- @commands.command(aliases=['referral','ref'])
+ @commands.command(aliases=['referral', 'ref'])
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def referral_links(self, ctx, target: discord.Member=None):
- 'Prints G-Portal Referral Links.'
- if self.bot.con.one('select referral_enabled from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}):
- referral_info = self.bot.con.one('select referral_message,referral_links from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ """Prints G-Portal Referral Links."""
+ if self.bot.con.one('select referral_enabled from guild_config where guild_id = %(id)s', {'id': ctx.guild.id}):
+ referral_info = self.bot.con.one('select referral_message,referral_links from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id})
message = referral_info[0]
referral_links = json.loads(referral_info[1])
for key in referral_links:
message = message + '\n{0}: {1}'.format(key, referral_links[key])
- if target == None:
+ if target is None:
await ctx.send(message)
else:
await ctx.send('{0}\n{1}'.format(target.mention, message))
else:
await ctx.send('Referrals are not enabled on this guild.')
+
def setup(bot):
- bot.add_cog(patreon(bot))
+ bot.add_cog(Patreon(bot))
diff --git a/exts/rcon.py b/exts/rcon.py
index 55c880b..1ceaa19 100644
--- a/exts/rcon.py
+++ b/exts/rcon.py
@@ -2,7 +2,8 @@ import discord
from discord.ext import commands
import json
from srcds import rcon as rcon_con
-import time, logging
+import time
+import logging
from datetime import datetime
import asyncio
import traceback
@@ -19,15 +20,17 @@ guild_config_dir = 'guild_config/'
rcon_log = logging.getLogger('rcon')
-game_commands = ['admin',]
+game_commands = ['admin', ]
game_prefix = '$'
-class rcon():
+
+class Rcon:
def __init__(self, bot):
self.bot = bot
- def _listplayers(self, con_info):
+ @staticmethod
+ def _listplayers(con_info):
con = rcon_con.RconConnection(con_info['ip'], con_info['port'], con_info['password'])
asyncio.sleep(5)
response = con.exec_command('listplayers')
@@ -38,7 +41,8 @@ class rcon():
rcon_log.info(response)
return response.strip(b'\n \x00\x00').decode('ascii').strip()
- def _saveworld(self, con_info):
+ @staticmethod
+ def _saveworld(con_info):
con = rcon_con.RconConnection(con_info['ip'], con_info['port'], con_info['password'])
asyncio.sleep(5)
response = con.exec_command('saveworld')
@@ -49,7 +53,8 @@ class rcon():
rcon_log.info(response)
return response.strip(b'\n \x00\x00').decode('ascii').strip()
- def _whitelist(self, con_info, steam_ids):
+ @staticmethod
+ def _whitelist(con_info, steam_ids):
messages = []
con = rcon_con.RconConnection(con_info['ip'], con_info['port'], con_info['password'])
asyncio.sleep(5)
@@ -63,7 +68,8 @@ class rcon():
messages.append(response.strip(b'\n \x00\x00').decode('ascii').strip())
return messages
- def _broadcast(self, con_info, message):
+ @staticmethod
+ def _broadcast(con_info, message):
messages = []
con = rcon_con.RconConnection(con_info['ip'], con_info['port'], con_info['password'])
asyncio.sleep(5)
@@ -76,7 +82,8 @@ class rcon():
messages.append(response.strip(b'\n \x00\x00').decode('ascii').strip())
return messages
- def _get_current_chat(self, con):
+ @staticmethod
+ def _get_current_chat(con):
response = con.exec_command('getchat')
rcon_log.debug(response)
return response.strip(b'\n \x00\x00').decode('ascii').strip()
@@ -92,30 +99,30 @@ class rcon():
time.sleep(1)
if 'Server received, But no response!!' not in message:
for msg in message.split('\n'):
- msg = '{0} ||| {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'),msg.strip())
+ msg = '{0} ||| {1}'.format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), msg.strip())
return_messages.append(msg)
- except rcon_con.RconError as e:
- rcon_log.error('RCON Error {0}\n{1}'.format(guild_id,traceback.format_exc()))
+ except rcon_con.RconError:
+ rcon_log.error('RCON Error {0}\n{1}'.format(guild_id, traceback.format_exc()))
return_messages.append('RCON Error')
except Exception as e:
- rcon_log.error('Exception {0}\n{1}'.format(guild_id,traceback.format_exc()))
+ rcon_log.error('Exception {0}\n{1}'.format(guild_id, traceback.format_exc()))
return_messages.append('Exception')
return_messages.append(e)
rcon_log.debug(return_messages)
return return_messages
-
-
- def admin(self, ctx, msg, rcon_server, admin_roles):
+ @staticmethod
+ def admin(ctx, msg, rcon_server, admin_roles):
player = msg.split(' ||| ')[1].split(' (')[0]
- con = rcon_con.RconConnection( rcon_server['ip'],
- rcon_server['port'],
- rcon_server['password'],
- True)
- con.exec_command('ServerChatToPlayer "{0}" GeeksBot: Admin Geeks have been notified you need assistance. Please be patient.'.format(player))
+ con = rcon_con.RconConnection(rcon_server['ip'],
+ rcon_server['port'],
+ rcon_server['password'],
+ True)
+ con.exec_command('ServerChatToPlayer "{0}" GeeksBot: Admin Geeks have been notified you need assistance. '
+ 'Please be patient.'.format(player))
con._sock.close()
for role in admin_roles:
- msg = '{0} {1}'.format(msg,discord.utils.get(ctx.guild.roles, id=admin_roles[role]).mention)
+ msg = '{0} {1}'.format(msg, discord.utils.get(ctx.guild.roles, id=admin_roles[role]).mention)
return msg
@commands.command()
@@ -124,29 +131,33 @@ class rcon():
'''Begins monitoring the specified ARK server for chat messages and other events.
The specified server must already be in the current guild\'s configuration.
To add and remove ARK servers from the guild see add_rcon_server and remove_rcon_server.
- The server argument is not case sensitive and if the server name has 2 words it can be in one of the following forms:
+ The server argument is not case sensitive and if the server name has two
+ words it can be in one of the following forms:
first last
first_last
"first last"
To view all the valid ARK servers for this guild see list_ark_servers.'''
if checks.is_rcon_admin(self.bot, ctx):
- if server != None:
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- server = server.replace('_',' ').title()
+ if server is not None:
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ server = server.replace('_', ' ').title()
if server in rcon_connections:
rcon_connections[server]["monitoring_chat"] = 1
- self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s', {'id':ctx.guild.id, 'json': json.dumps(rcon_connections)})
+ self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'json': json.dumps(rcon_connections)})
channel = self.bot.get_channel(rcon_connections[server]['game_chat_chan_id'])
await channel.send('Started monitoring on the {0} server.'.format(server))
await ctx.message.add_reaction('✅')
rcon_log.debug('Started monitoring on the {0} server.'.format(server))
while rcon_connections[server]["monitoring_chat"] == 1:
try:
- con = rcon_con.RconConnection( rcon_connections[server]['ip'],
- rcon_connections[server]['port'],
- rcon_connections[server]['password'],
- True)
- messages = await self.bot.loop.run_in_executor(None, self.server_chat_background_process, ctx.guild.id, con)
+ con = rcon_con.RconConnection(rcon_connections[server]['ip'],
+ rcon_connections[server]['port'],
+ rcon_connections[server]['password'],
+ True)
+ messages = await self.bot.loop.run_in_executor(None, self.server_chat_background_process,
+ ctx.guild.id, con)
con._sock.close()
except TimeoutError:
rcon_log.error(traceback.format_exc())
@@ -158,7 +169,7 @@ class rcon():
rcon_log.info(message)
message = '```{0}```'.format(message)
for command in game_commands:
- prefix_command = '{0}{1}'.format(game_prefix,command)
+ prefix_command = '{0}{1}'.format(game_prefix, command)
if prefix_command in message:
try:
func = getattr(self, command)
@@ -169,7 +180,8 @@ class rcon():
message = func(ctx, message, rcon_connections['server'])
await channel.send('{0}'.format(message))
await asyncio.sleep(1)
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
await channel.send('Monitoring Stopped')
else:
await ctx.send(f'Server not found: {server}')
@@ -181,15 +193,17 @@ class rcon():
@commands.command()
@commands.guild_only()
async def end_monitor_chat(self, ctx, *, server=None):
- '''Ends chat monitoring on the specified server.
- Context is the same as monitor_chat'''
+ """Ends chat monitoring on the specified server.
+ Context is the same as monitor_chat"""
if checks.is_rcon_admin(self.bot, ctx):
- if server != None:
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- server = server.replace('_',' ').title()
+ if server is not None:
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ server = server.replace('_', ' ').title()
if server in rcon_connections:
rcon_connections[server]["monitoring_chat"] = 0
- self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s', {'id':ctx.guild.id, 'json': json.dumps(rcon_connections)})
+ self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'json': json.dumps(rcon_connections)})
else:
await ctx.send(f'Server not found: {server}')
else:
@@ -200,18 +214,20 @@ class rcon():
@commands.command()
@commands.guild_only()
async def listplayers(self, ctx, *, server=None):
- '''Lists the players currently connected to the specified ARK server.
+ """Lists the players currently connected to the specified ARK server.
The specified server must already be in the current guild\'s configuration.
To add and remove ARK servers from the guild see add_rcon_server and remove_rcon_server.
- The server argument is not case sensitive and if the server name has 2 words it can be in one of the following forms:
+ The server argument is not case sensitive and if the server name has two
+ words it can be in one of the following forms:
first last
first_last
"first last"
- To view all the valid ARK servers for this guild see list_ark_servers.'''
+ To view all the valid ARK servers for this guild see list_ark_servers."""
if checks.is_rcon_admin(self.bot, ctx):
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- if server != None:
- server = server.replace('_',' ').title()
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ if server is not None:
+ server = server.replace('_', ' ').title()
if server in rcon_connections:
connection_info = rcon_connections[server]
msg = await ctx.send('Getting Data for the {0} server'.format(server.title()))
@@ -221,7 +237,8 @@ class rcon():
await msg.delete()
await ctx.send('Players currently on the {0} server:\n{1}'.format(server.title(), message))
else:
- await ctx.send('That server is not in my configuration.\nPlease add it via !add_rcon_server "{0}" "ip" port "password" if you would like to get info from it.'.format(server))
+ await ctx.send('That server is not in my configuration.\nPlease add it via !add_rcon_server "{0}" '
+ '"ip" port "password" if you would like to get info from it.'.format(server))
else:
for server in rcon_connections:
try:
@@ -241,22 +258,24 @@ class rcon():
@commands.command()
@commands.guild_only()
async def add_rcon_server(self, ctx, server, ip, port, password):
- '''Adds the specified server to the current guild\'s rcon config.
- All strings (, , ) must be contained inside double quotes.'''
+ """Adds the specified server to the current guild\'s rcon config.
+ All strings (, , ) must be contained inside double quotes."""
if checks.is_rcon_admin(self.bot, ctx):
server = server.title()
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
if server not in rcon_connections:
rcon_connections[server] = {
'ip': ip,
'port': port,
'password': password,
- 'name': server.lower().replace(' ','_'),
+ 'name': server.lower().replace(' ', '_'),
'game_chat_chan_id': 0,
'msg_chan_id': 0,
'monitoring_chat': 0
}
- self.bot.con.run('update guild_config set rcon_connections = %(connections)s where guild_id = %(id)s', {'id':ctx.guild.id, 'connections':json.dumps(rcon_connections)})
+ self.bot.con.run('update guild_config set rcon_connections = %(connections)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'connections': json.dumps(rcon_connections)})
await ctx.send('{0} server has been added to my configuration.'.format(server))
else:
await ctx.send('This server name is already in my configuration. Please choose another.')
@@ -268,14 +287,16 @@ class rcon():
@commands.command()
@commands.guild_only()
async def remove_rcon_server(self, ctx, server):
- '''removes the specified server from the current guild\'s rcon config.
- All strings must be contained inside double quotes.'''
+ """removes the specified server from the current guild\'s rcon config.
+ All strings must be contained inside double quotes."""
if checks.is_rcon_admin(self.bot, ctx):
server = server.title()
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
if server in rcon_connections:
del rcon_connections[server]
- self.bot.con.run('update guild_config set rcon_connections = %(connections)s where guild_id = %(id)s', {'id':ctx.guild.id, 'connections':json.dumps(rcon_connections)})
+ self.bot.con.run('update guild_config set rcon_connections = %(connections)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'connections': json.dumps(rcon_connections)})
await ctx.send('{0} has been removed from my configuration.'.format(server))
else:
await ctx.send('{0} is not in my configuration.'.format(server))
@@ -285,16 +306,17 @@ class rcon():
@commands.command()
@commands.guild_only()
async def add_whitelist(self, ctx, *, steam_ids=None):
- '''Adds the included Steam 64 IDs to the running whitelist on all the ARK servers in the current guild\'s rcon config.
+ """Adds the included Steam 64 IDs to the running whitelist on all the ARK servers in the current guild\'s rcon config.
Steam 64 IDs should be a comma seperated list of IDs.
- Example: 76561198024193239,76561198024193239,76561198024193239'''
+ Example: 76561198024193239,76561198024193239,76561198024193239"""
if checks.is_rcon_admin(self.bot, ctx):
- if steam_ids != None:
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ if steam_ids is not None:
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
error = 0
error_msg = ''
success_msg = 'Adding to the running whitelist on all servers.'
- steam_ids = steam_ids.replace(', ',',').replace(' ',',').split(',')
+ steam_ids = steam_ids.replace(', ', ',').replace(' ', ',').split(',')
for (i, steam_id) in enumerate(steam_ids):
try:
steam_id = int(steam_id)
@@ -309,7 +331,10 @@ class rcon():
try:
success_msg = '{0}\n\n{1}:'.format(success_msg, server.title())
await msg.edit(content=success_msg.strip())
- messages = await self.bot.loop.run_in_executor(None, self._whitelist, rcon_connections[server], steam_ids)
+ messages = await self.bot.loop.run_in_executor(None,
+ self._whitelist,
+ rcon_connections[server],
+ steam_ids)
except Exception as e:
success_msg = '{0}\n{1}'.format(success_msg, e.strip())
await msg.edit(content=success_msg.strip())
@@ -328,17 +353,15 @@ class rcon():
@commands.command()
@commands.guild_only()
async def saveworld(self, ctx, *, server=None):
- '''Runs SaveWorld on the specified ARK server.
+ """Runs SaveWorld on the specified ARK server.
If a server is not specified it will default to running saveworld on all servers in the guild\'s config.
- Will print out "World Saved" for each server when the command completes sucessfully.'''
+ Will print out "World Saved" for each server when the command completes successfully."""
if checks.is_rcon_admin(self.bot, ctx):
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
success_msg = 'Running saveworld'
- if server == None:
+ if server is None:
success_msg += ' on all the servers:'
- # server = server.replace('_',' ').title()
- if server in rcon_connections:
- connection_info = rcon_connections[server]
msg = await ctx.send(success_msg)
for server in rcon_connections:
try:
@@ -352,8 +375,8 @@ class rcon():
success_msg = '{0}\n{1}'.format(success_msg, message.strip())
await msg.edit(content=success_msg.strip())
await msg.add_reaction('✅')
- elif server.title() in rcon_connections:
- success_msg = '{0} {1}:'.format(success_msg, server.title())
+ elif server.replace('_', ' ').title() in rcon_connections:
+ success_msg = '{0} {1}:'.format(success_msg, server.replace('_', ' ').title())
msg = await ctx.send(success_msg)
message = await self.bot.loop.run_in_executor(None, self._saveworld, rcon_connections[server.title()])
success_msg = '{0}\n{1}'.format(success_msg, message.strip())
@@ -366,18 +389,19 @@ class rcon():
@commands.group(case_insensitive=True)
async def broadcast(self, ctx):
- '''Run help broadcast for more info'''
+ """Run help broadcast for more info"""
pass
@broadcast.command(name='all')
@commands.guild_only()
async def broadcast_all(self, ctx, *, message=None):
- '''Sends a broadcast message to all servers in the guild config.
+ """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.'''
+ Will print "Success" for each server once the broadcast is sent."""
if checks.is_rcon_admin(self.bot, ctx):
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- if message != None:
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ if message is not None:
message = f'{ctx.author.display_name}: {message}'
success_msg = f'Broadcasting "{message}" to all servers.'
msg = await ctx.send(success_msg)
@@ -385,7 +409,10 @@ class rcon():
try:
success_msg = '{0}\n\n{1}:'.format(success_msg, server.title())
await msg.edit(content=success_msg.strip())
- messages = await self.bot.loop.run_in_executor(None, self._broadcast, rcon_connections[server], message)
+ messages = await self.bot.loop.run_in_executor(None,
+ self._broadcast,
+ rcon_connections[server],
+ message)
except Exception as e:
success_msg = '{0}\n{1}'.format(success_msg, e.strip())
await msg.edit(content=success_msg.strip())
@@ -404,19 +431,24 @@ class rcon():
@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.
+ """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 sorrounded by double quotes or the words seperated by _'''
+ 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 checks.is_rcon_admin(self.bot, ctx):
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- if server != None:
- server = server.replace('_',' ').title()
- if message != None:
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ if server is not None:
+ server = server.replace('_', ' ').title()
+ if message is not None:
message = f'{ctx.author.display_name}: {message}'
success_msg = f'Broadcasting "{message}" to {server}.'
msg = await ctx.send(success_msg)
if server in rcon_connections:
- messages = await self.bot.loop.run_in_executor(None, self._broadcast, rcon_connections[server], message)
+ messages = await self.bot.loop.run_in_executor(None,
+ self._broadcast,
+ rcon_connections[server],
+ message)
for mesg in messages:
if mesg != 'Server received, But no response!!':
success_msg = '{0}\n{1}'.format(success_msg, mesg.strip())
@@ -434,18 +466,21 @@ class rcon():
@commands.command()
@commands.guild_only()
async def create_server_chat_chans(self, ctx):
- '''Creates a category and server chat channels in the current guild.
+ """Creates a category and server chat channels in the current guild.
The category will be named "Server Chats" and read_messages is disabled for the guild default role (everyone)
This can be overridden by modifying the category's permissions.
- Inside this category a channel will be created for each server in the current guild's rcon config and these channel's permissions will be synced to the category.
- These channels will be added to the guild's rcon config and are where the server chat messages will be sent when monitor_chat is run.'''
+ Inside this category a channel will be created for each server in the current guild's rcon config
+ and these channel's permissions will be synced to the category.
+ These channels will be added to the guild's rcon config and are where the
+ server chat messages will be sent when monitor_chat is run."""
if checks.is_rcon_admin(self.bot, ctx):
- rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
+ rcon_connections = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
edited = 0
category = discord.utils.get(ctx.guild.categories, name='Server Chats')
- if category == None:
+ if category is None:
overrides = {ctx.guild.default_role: discord.PermissionOverwrite(read_messages=False)}
- category = await ctx.guild.create_category('Server Chats', overwrites = overrides)
+ category = await ctx.guild.create_category('Server Chats', overwrites=overrides)
channels = ctx.guild.channels
cat_chans = []
for channel in channels:
@@ -453,37 +488,43 @@ class rcon():
cat_chans.append(channel)
for server in rcon_connections:
exists = 0
- if cat_chans != []:
+ if cat_chans:
for channel in cat_chans:
if rcon_connections[server]['game_chat_chan_id'] == channel.id:
exists = 1
if exists == 0:
print('Creating {}'.format(server))
- chan = await ctx.guild.create_text_channel(rcon_connections[server]['name'],category=category)
+ chan = await ctx.guild.create_text_channel(rcon_connections[server]['name'], category=category)
rcon_connections[server]['game_chat_chan_id'] = chan.id
edited = 1
if edited == 1:
- self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s', {'id':ctx.guild.id, 'json': json.dumps(rcon_connections)})
+ self.bot.con.run('update guild_config set rcon_connections = %(json)s where guild_id = %(id)s',
+ {'id': ctx.guild.id, 'json': json.dumps(rcon_connections)})
await ctx.message.add_reaction('✅')
else:
await ctx.send(f'You are not authorized to run this command.')
- @commands.command(aliases=['servers','list_servers'])
+ @commands.command(aliases=['servers', 'list_servers'])
@commands.guild_only()
@commands.check(checks.is_restricted_chan)
async def list_ark_servers(self, ctx):
- '''Returns a list of all the ARK servers in the current guild\'s config.'''
- servers = json.loads(self.bot.con.one('select rcon_connections from guild_config where guild_id = %(id)s', {'id':ctx.guild.id}))
- em = discord.Embed( style='rich',
- title=f'__**There are currently {len(servers)} ARK servers in my config:**__',
- color=discord.Colour.green()
- )
+ """Returns a list of all the ARK servers in the current guild\'s config."""
+ servers = json.loads(self.bot.con.one('select rcon_connections from guild_config\
+ where guild_id = %(id)s', {'id': ctx.guild.id}))
+ em = discord.Embed(style='rich',
+ title=f'__**There are currently {len(servers)} ARK servers in my config:**__',
+ color=discord.Colour.green()
+ )
if ctx.guild.icon:
em.set_thumbnail(url=f'{ctx.guild.icon_url}')
for server in servers:
- description = f"឵ **IP:** {servers[server]['ip']}:{servers[server]['port']}\n឵ **Steam Connect:** [steam://connect/{servers[server]['ip']}:{servers[server]['port']}](steam://connect/{servers[server]['ip']}:{servers[server]['port']})"
+ description = f"""
+ ឵ **IP:** {servers[server]['ip']}:{servers[server]['port']}
+ ឵ **Steam Connect:** [steam://connect/{servers[server]['ip']}:{servers[server]['port']}]\
+ (steam://connect/{servers[server]['ip']}:{servers[server]['port']})"""
em.add_field(name=f'__***{server}***__', value=description, inline=False)
await ctx.send(embed=em)
+
def setup(bot):
- bot.add_cog(rcon(bot))
+ bot.add_cog(Rcon(bot))
diff --git a/exts/repl.py b/exts/repl.py
index 6bd9d41..8156c38 100644
--- a/exts/repl.py
+++ b/exts/repl.py
@@ -1,8 +1,5 @@
from discord.ext import commands
-import time
-import datetime
-import math
import asyncio
import traceback
import discord
@@ -10,28 +7,28 @@ import inspect
import textwrap
from contextlib import redirect_stdout
import io
-import os, sys
-import subprocess
-import async_timeout
from .imports.utils import paginate, run_command
-ownerids = [351794468870946827,275280442884751360]
+ownerids = [351794468870946827, 275280442884751360]
ownerid = 351794468870946827
-class REPL():
+
+class Repl:
def __init__(self, bot):
self.bot = bot
self._last_result = None
self.sessions = set()
- def cleanup_code(self, content):
- 'Automatically removes code blocks from the code.'
+ @staticmethod
+ def cleanup_code(content):
+ """Automatically removes code blocks from the code."""
if content.startswith('```') and content.endswith('```'):
return '\n'.join(content.split('\n')[1:(- 1)])
return content.strip('` \n')
- def get_syntax_error(self, e):
+ @staticmethod
+ def get_syntax_error(e):
if e.text is None:
return '```py\n{0.__class__.__name__}: {0}\n```'.format(e)
return '```py\n{0.text}{1:>{0.offset}}\n{2}: {0}```'.format(e, '^', type(e).__name__)
@@ -61,14 +58,14 @@ class REPL():
try:
with redirect_stdout(stdout):
ret = await func()
- except Exception as e:
+ except Exception:
value = stdout.getvalue()
await ctx.send('```py\n{}{}\n```'.format(value, traceback.format_exc()))
else:
value = stdout.getvalue()
try:
await ctx.message.add_reaction('✅')
- except:
+ except Exception:
pass
if ret is None:
if value:
@@ -131,7 +128,7 @@ class REPL():
result = executor(code, variables)
if inspect.isawaitable(result):
result = await result
- except Exception as e:
+ except Exception:
value = stdout.getvalue()
fmt = '{}{}'.format(value, traceback.format_exc())
else:
@@ -160,7 +157,7 @@ class REPL():
return
try:
body = self.cleanup_code(body).split(' ')
- result = await asyncio.wait_for(self.bot.loop.create_task(run_command(body)),10)
+ result = await asyncio.wait_for(self.bot.loop.create_task(run_command(body)), 10)
value = result
for page in paginate(value):
await ctx.send(page)
@@ -171,5 +168,6 @@ class REPL():
await ctx.send(page)
await ctx.message.add_reaction('❌')
+
def setup(bot):
- bot.add_cog(REPL(bot))
+ bot.add_cog(Repl(bot))
diff --git a/exts/utils.py b/exts/utils.py
index 101d678..d3df557 100644
--- a/exts/utils.py
+++ b/exts/utils.py
@@ -1,15 +1,13 @@
import discord
from discord.ext import commands
import json
-from srcds import rcon as rcon_con
-import time, logging, math, psutil
+import logging
+import math
+import psutil
from datetime import datetime, timedelta
-import asyncio, inspect
-import aiohttp, async_timeout
-from bs4 import BeautifulSoup as bs
-import traceback
+import asyncio
+import async_timeout
from .imports import checks
-from .imports.utils import paginate
import pytz
import gspread
from oauth2client.service_account import ServiceAccountCredentials
@@ -18,14 +16,15 @@ config_dir = 'config/'
admin_id_file = 'admin_ids'
extension_dir = 'extensions'
owner_id = 351794468870946827
-embed_color = discord.Colour.from_rgb(49,107,111)
+embed_color = discord.Colour.from_rgb(49, 107, 111)
bot_config_file = 'bot_config.json'
invite_match = '(https?://)?(www.)?discord(app.com/(invite|oauth2)|.gg|.io)/[\w\d_\-?=&/]+'
utils_log = logging.getLogger('utils')
-clock_emojis = ['🕛','🕐','🕑','🕒','🕓','🕔','🕕','🕖','🕗','🕘','🕙','🕚']
+clock_emojis = ['🕛', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚']
-class utils():
+
+class Utils:
def __init__(self, bot):
self.bot = bot
@@ -46,24 +45,29 @@ class utils():
self.bot.ping_times[i]['rec'] = msg
@commands.command()
- async def channel_ping(self, ctx, wait_time:float=10, message:str='=bump', channel:int=265828729970753537):
+ async def channel_ping(self, ctx, wait_time: float=10, message: str='=bump', channel: int=265828729970753537):
await ctx.send('Starting Background Process.')
self.bot.loop.create_task(self._4_hour_ping(channel, message, wait_time))
@commands.command()
@commands.is_owner()
async def sysinfo(self, ctx):
- await ctx.send(f'```ml\nCPU Percentages: {psutil.cpu_percent(percpu=True)}\nMemory Usage: {psutil.virtual_memory().percent}%\nDisc Usage: {psutil.disk_usage("/").percent}%```')
+ await ctx.send(f'''
+ ```ml
+ CPU Percentages: {psutil.cpu_percent(percpu=True)}
+ Memory Usage: {psutil.virtual_memory().percent}%
+ Disc Usage: {psutil.disk_usage("/").percent}%
+ ```''')
@commands.command(hidden=True)
async def role(self, ctx, role):
if ctx.guild.id == 396156980974059531 and role != 'Admin' and role != 'Admin Geeks':
try:
role = discord.utils.get(ctx.guild.roles, name=role)
- except:
+ except Exception:
await ctx.send('Unknown Role')
else:
- if role != None:
+ if role is not None:
await ctx.message.author.add_roles(role)
await ctx.send("Roles Updated")
else:
@@ -73,86 +77,121 @@ class utils():
@commands.command(aliases=['oauth', 'link'])
@commands.cooldown(1, 5, type=commands.BucketType.user)
- async def invite(self, ctx, guy:discord.User=None):
- '''Shows you the bot's invite link.
+ async def invite(self, ctx, guy: discord.User=None):
+ """Shows you the bot's invite link.
If you pass in an ID of another bot, it gives you the invite link to that bot.
- '''
+ """
guy = guy or self.bot.user
url = discord.utils.oauth_url(guy.id)
await ctx.send(f'**{url}**')
- def create_date_string(self, time, time_now):
+ @staticmethod
+ def create_date_string(time, time_now):
diff = (time_now - time)
date_str = time.strftime('%Y-%m-%d %H:%M:%S')
- return f"{diff.days} {'day' if diff.days == 1 else 'days'} {diff.seconds // 3600} {'hour' if diff.seconds // 3600 == 1 else 'hours'} {diff.seconds % 3600 // 60} {'minute' if diff.seconds % 3600 // 60 == 1 else 'minutes'} {diff.seconds % 3600 % 60} {'second' if diff.seconds % 3600 % 60 == 1 else 'seconds'} ago.\n{date_str}"
+ return f"{diff.days} {'day' if diff.days == 1 else 'days'} " \
+ f"{diff.seconds // 3600} {'hour' if diff.seconds // 3600 == 1 else 'hours'} " \
+ f"{diff.seconds % 3600 // 60} {'minute' if diff.seconds % 3600 // 60 == 1 else 'minutes'} " \
+ f"{diff.seconds % 3600 % 60} {'second' if diff.seconds % 3600 % 60 == 1 else 'seconds'} ago.\n{date_str}"
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def me(self, ctx):
- 'Prints out your user information.'
- em = discord.Embed( style='rich',
- title=f'{ctx.author.name}#{ctx.author.discriminator} ({ctx.author.display_name})',
- description=f'({ctx.author.id})',
- color=embed_color)
+ """Prints out your user information."""
+ em = discord.Embed(style='rich',
+ title=f'{ctx.author.name}#{ctx.author.discriminator} ({ctx.author.display_name})',
+ description=f'({ctx.author.id})',
+ color=embed_color)
em.set_thumbnail(url=f'{ctx.author.avatar_url}')
- em.add_field(name=f'Highest Role:', value=f'{ctx.author.top_role}', inline=True)
- em.add_field(name=f'Bot:', value=f'{ctx.author.bot}', inline=True)
- em.add_field(name=f'Joined Guild:', value=f'{self.create_date_string(ctx.author.joined_at,ctx.message.created_at)}', inline=False)
- em.add_field(name=f'Joined Discord:', value=f'{self.create_date_string(ctx.author.created_at,ctx.message.created_at)}', inline=False)
- em.add_field(name=f'Current Status:', value=f'{ctx.author.status}', inline=True)
- em.add_field(name=f"Currently{' '+ctx.author.activity.type.name.title() if ctx.author.activity else ''}:", value=f"{ctx.author.activity.name if ctx.author.activity else 'Not doing anything important.'}", inline=True)
+ em.add_field(name=f'Highest Role:',
+ value=f'{ctx.author.top_role}',
+ inline=True)
+ em.add_field(name=f'Bot:',
+ value=f'{ctx.author.bot}',
+ inline=True)
+ em.add_field(name=f'Joined Guild:',
+ value=f'{self.create_date_string(ctx.author.joined_at, ctx.message.created_at)}',
+ inline=False)
+ em.add_field(name=f'Joined Discord:',
+ value=f'{self.create_date_string(ctx.author.created_at, ctx.message.created_at)}',
+ inline=False)
+ em.add_field(name=f'Current Status:',
+ value=f'{ctx.author.status}',
+ inline=True)
+ em.add_field(name=f"Currently{' '+ctx.author.activity.type.name.title() if ctx.author.activity else ''}:",
+ value=f"{ctx.author.activity.name if ctx.author.activity else 'Not doing anything important.'}",
+ inline=True)
count = 0
- async for message in ctx.channel.history(after=(ctx.message.created_at - timedelta(hours = 1))):
+ async for message in ctx.channel.history(after=(ctx.message.created_at - timedelta(hours=1))):
if message.author == ctx.author:
count += 1
- em.add_field(name=f'Activity:', value=f'You have sent {count} {"message" if count == 1 else "messages"} in the last hour to this channel.', inline=False)
+ em.add_field(name=f'Activity:',
+ value=f'You have sent {count} '
+ f'{"message" if count == 1 else "messages"} in the last hour to this channel.',
+ inline=False)
await ctx.send(embed=em)
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
async def user(self, ctx, member: discord.Member):
- '''Prints User information.
- should be in the form @Dusty.P#0001'''
- em = discord.Embed( style='rich',
- title=f'{member.name}#{member.discriminator} ({member.display_name})',
- description=f'({member.id})',
- color=embed_color)
+ """Prints User information.
+ should be in the form @Dusty.P#0001"""
+ em = discord.Embed(style='rich',
+ title=f'{member.name}#{member.discriminator} ({member.display_name})',
+ description=f'({member.id})',
+ color=embed_color)
em.set_thumbnail(url=f'{member.avatar_url}')
- em.add_field(name=f'Highest Role:', value=f'{member.top_role}', inline=True)
- em.add_field(name=f'Bot:', value=f'{member.bot}', inline=True)
- em.add_field(name=f'Joined Guild:', value=f'{self.create_date_string(member.joined_at,ctx.message.created_at)}', inline=False)
- em.add_field(name=f'Joined Discord:', value=f'{self.create_date_string(member.created_at,ctx.message.created_at)}', inline=False)
- em.add_field(name=f'Current Status:', value=f'{member.status}', inline=True)
- em.add_field(name=f"Currently{' '+member.activity.type.name.title() if member.activity else ''}:", value=f"{member.activity.name if member.activity else 'Not doing anything important.'}", inline=True)
+ em.add_field(name=f'Highest Role:',
+ value=f'{member.top_role}',
+ inline=True)
+ em.add_field(name=f'Bot:',
+ value=f'{member.bot}',
+ inline=True)
+ em.add_field(name=f'Joined Guild:',
+ value=f'{self.create_date_string(member.joined_at,ctx.message.created_at)}',
+ inline=False)
+ em.add_field(name=f'Joined Discord:',
+ value=f'{self.create_date_string(member.created_at,ctx.message.created_at)}',
+ inline=False)
+ em.add_field(name=f'Current Status:',
+ value=f'{member.status}',
+ inline=True)
+ em.add_field(name=f"Currently{' '+member.activity.type.name.title() if member.activity else ''}:",
+ value=f"{member.activity.name if member.activity else 'Not doing anything important.'}",
+ inline=True)
count = 0
- async for message in ctx.channel.history(after=(ctx.message.created_at - timedelta(hours = 1))):
+ async for message in ctx.channel.history(after=(ctx.message.created_at - timedelta(hours=1))):
if message.author == member:
count += 1
- em.add_field(name=f'Activity:', value=f'{member.display_name} has sent {count} {"message" if count == 1 else "messages"} in the last hour to this channel.', inline=False)
+ em.add_field(name=f'Activity:',
+ value=f'{member.display_name} has sent {count} '
+ f'{"message" if count == 1 else "messages"} in the last hour to this channel.',
+ inline=False)
await ctx.send(embed=em)
@commands.command()
@commands.cooldown(1, 5, type=commands.BucketType.user)
- async def ping(self, ctx, mode='normal', count:int=2):
- 'Check the Bot\'s connection to Discord'
- em = discord.Embed( style='rich',
- title=f'Pong 🏓',
- color=discord.Colour.green()
- )
+ async def ping(self, ctx, mode='normal', count: int=2):
+ """Check the Bot\'s connection to Discord"""
+ em = discord.Embed(style='rich',
+ title=f'Pong 🏓',
+ color=discord.Colour.green()
+ )
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**\nDiscord Latency: **{math.ceil(self.bot.latency*1000)}ms**'
+ em.description = f'''Response Time: **{math.ceil(time)}ms**
+ Discord Latency: **{math.ceil(self.bot.latency*1000)}ms**'''
await msg.edit(embed=em)
if mode == 'comp':
try:
count = int(count)
- except:
+ except Exception:
await ctx.send('Not a valid count. Must be a whole number.')
else:
if count > 24:
- await ctx.send('24 Pings is the max allowed. Setting count to 24.',delete_after=5)
+ await ctx.send('24 Pings is the max allowed. Setting count to 24.', delete_after=5)
count = 24
self.bot.ping_times = []
times = []
@@ -170,7 +209,10 @@ class utils():
time = now - self.bot.ping_times[i]['snd'].created_at
time = time.total_seconds()
times.append(time)
- value = f"Message Sent: {datetime.strftime(self.bot.ping_times[i]['snd'].created_at, '%H:%M:%S.%f')}\nResponse Received: {datetime.strftime(now, '%H:%M:%S.%f')}\nTotal Time: {math.ceil(time * 1000)}ms"
+ value = f"Message Sent:" \
+ f"{datetime.strftime(self.bot.ping_times[i]['snd'].created_at, '%H:%M:%S.%f')}" \
+ f"Response Received: {datetime.strftime(now, '%H:%M:%S.%f')}" \
+ f"Total Time: {math.ceil(time * 1000)}ms"
await self.bot.ping_times[i]['rec'].delete()
em.add_field(name=f'Ping Test {i}', value=value, inline=True)
else:
@@ -179,40 +221,50 @@ class utils():
print(times)
for time in times:
total_time += time * 1000
- em.add_field(value=f'Total Time for Comprehensive test: {math.ceil(total_time)}ms', name=f'Average: **{round(total_time/count,1)}ms**', inline=False)
+ em.add_field(value=f'Total Time for Comprehensive test: {math.ceil(total_time)}ms',
+ name=f'Average: **{round(total_time/count,1)}ms**',
+ inline=False)
await msg.edit(embed=em)
@commands.group(case_insensitive=True)
async def admin(self, ctx):
- '''Run help admin for more info'''
+ """Run help admin for more info"""
pass
@admin.command(name='new', aliases=['nr'])
@commands.cooldown(1, 30, type=commands.BucketType.user)
async def new_admin_request(self, ctx, *, request_msg=None):
- '''Submit a new request for admin assistance.
+ """Submit a new request for admin assistance.
The admin will be notified when your request is made and it will be added to the request list for this guild.
- '''
+ """
if ctx.guild:
- if request_msg != None:
+ if request_msg is not None:
if len(request_msg) < 1000:
- self.bot.con.run('insert into admin_requests (issuing_member_id, guild_orig, request_text, request_time) values (%(member_id)s, %(guild_id)s, %(text)s, %(time)s)',
- {'member_id': ctx.author.id, 'guild_id': ctx.guild.id, 'text': request_msg, 'time': ctx.message.created_at})
+ self.bot.con.run('insert into admin_requests (issuing_member_id, guild_orig, request_text,'
+ 'request_time) values (%(member_id)s, %(guild_id)s, %(text)s, %(time)s)',
+ {'member_id': ctx.author.id, 'guild_id': ctx.guild.id, 'text': request_msg,
+ 'time': ctx.message.created_at})
channel = self.bot.con.one(f'select admin_chat from guild_config where guild_id = {ctx.guild.id}')
if channel:
chan = discord.utils.get(ctx.guild.channels, id=channel)
msg = ''
admin_roles = []
- roles = self.bot.con.one(f'select admin_roles,rcon_admin_roles from guild_config where guild_id = {ctx.guild.id}')
- request_id = self.bot.con.one(f'select id from admin_requests where issuing_member_id = %(member_id)s and request_time = %(time)s', {'member_id': ctx.author.id, 'time': ctx.message.created_at})
+ roles = self.bot.con.one(f'select admin_roles,rcon_admin_roles from guild_config where '
+ f'guild_id = %(id)s', {'id': ctx.guild.id})
+ request_id = self.bot.con.one(f'select id from admin_requests where '
+ f'issuing_member_id = %(member_id)s and request_time = %(time)s',
+ {'member_id': ctx.author.id, 'time': ctx.message.created_at})
for item in roles:
i = json.loads(item)
for j in i:
if i[j] not in admin_roles:
admin_roles.append(i[j])
for role in admin_roles:
- msg = '{0} {1}'.format(msg,discord.utils.get(ctx.guild.roles, id=role).mention)
- msg += f" New Request ID: {request_id}\n{ctx.author.mention} has requested assistance:\n```{request_msg}```\nRequested on: {datetime.strftime(ctx.message.created_at, '%Y-%m-%d at %H:%M:%S')} GMT"
+ msg = '{0} {1}'.format(msg, discord.utils.get(ctx.guild.roles, id=role).mention)
+ msg += f"""New Request ID: {request_id}
+ {ctx.author.mention} has requested assistance:
+ ```{request_msg}```
+ Requested on: {datetime.strftime(ctx.message.created_at, '%Y-%m-%d at %H:%M:%S')} GMT"""
await chan.send(msg)
await ctx.send('The Admin have received your request.')
else:
@@ -224,76 +276,108 @@ class utils():
@admin.command(name='list', aliases=['lr'])
@commands.cooldown(1, 5, type=commands.BucketType.user)
- async def list_admin_requests(self, ctx, assigned_to:discord.Member=None):
- '''Returns a list of all active Admin help requests for this guild
+ async def list_admin_requests(self, ctx, assigned_to: discord.Member=None):
+ """Returns a list of all active Admin help requests for this guild
If a user runs this command it will return all the requests that they have submitted and are still open.
- The [assigned_to] argument is ignored but will still give an error if an incorrect value is entered.
If an admin runs this command it will return all the open requests for this guild.
- - If the [assigned_to] argument is included it will instead return all open requests that are assigned to the specified admin.
- '''
- em = discord.Embed( style='rich',
- title=f'Admin Help Requests',
- color=discord.Colour.green()
- )
+ - If the [assigned_to] argument is included it will instead return all open requests that
+ are assigned to the specified admin.
+ """
+ em = discord.Embed(style='rich',
+ title=f'Admin Help Requests',
+ color=discord.Colour.green()
+ )
if checks.is_admin(self.bot, ctx) or checks.is_rcon_admin(self.bot, ctx):
- if assigned_to == None:
- requests = self.bot.con.all(f'select * from admin_requests where guild_orig = %(guild_id)s and completed_time is null', {'guild_id': ctx.guild.id})
+ if assigned_to is None:
+ requests = self.bot.con.all(f'select * from admin_requests where guild_orig = %(guild_id)s '
+ f'and completed_time is null', {'guild_id': ctx.guild.id})
em.title = f'Admin help requests for {ctx.guild.name}'
if requests:
for request in requests:
member = discord.utils.get(ctx.guild.members, id=request[1])
admin = discord.utils.get(ctx.guild.members, id=request[2])
- title = f"{'Request ID':^12}{'Requested By':^20}{'Assigned to':^20}\n{request[0]:^12}{member.display_name if member else 'None':^20}{admin.display_name if admin else 'None':^20}"
- em.add_field(name='', value=f"```{title}\n\n{request[4]}\n\nRequested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT```", inline=False)
+ title = f"""{'Request ID':^12}{'Requested By':^20}{'Assigned to':^20}
+ {request[0]:^12}{member.display_name if member else 'None':^20}
+ {admin.display_name if admin else 'None':^20}"""
+ em.add_field(name='',
+ value=f"""```{title}
+
+ {request[4]}
+
+ Requested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT```""",
+ inline=False)
else:
em.add_field(name='There are no pending requests for this guild.', value='', inline=False)
else:
- if checks.check_admin_role(self.bot, ctx, assigned_to) or checks.check_rcon_role(self.bot, ctx, assigned_to):
- requests = self.bot.con.all('select * from admin_requests where assigned_to = %(admin_id)s and guild_orig = %(guild_id)s and completed_time is null',
- {'admin_id': assigned_to.id, 'guild_id': ctx.guild.id})
- em.title = f'Admin help requests asigned to {assigned_to.display_name} in {ctx.guild.name}'
+ if checks.check_admin_role(self.bot, ctx, assigned_to)\
+ or checks.check_rcon_role(self.bot, ctx, assigned_to):
+ requests = self.bot.con.all('select * from admin_requests where assigned_to = %(admin_id)s '
+ 'and guild_orig = %(guild_id)s and completed_time is null',
+ {'admin_id': assigned_to.id, 'guild_id': ctx.guild.id})
+ em.title = f'Admin help requests assigned to {assigned_to.display_name} in {ctx.guild.name}'
if requests:
for request in requests:
member = discord.utils.get(ctx.guild.members, id=request[1])
- em.add_field(name=f"Request ID: {request[0]} Requested By: {member.display_name if member else 'None'}", value=f"{request[4]}\nRequested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT\n", inline=False)
+ em.add_field(name=f"Request ID: {request[0]} Requested By:"
+ f"{member.display_name if member else 'None'}",
+ value=f"""{request[4]}
+ Requested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT
+ """,
+ inline=False)
else:
- em.add_field(name=f'There are no pending requests for {assigned_to.display_name} this guild.', value='', inline=False)
+ em.add_field(name=f'There are no pending requests for {assigned_to.display_name} this guild.',
+ value='',
+ inline=False)
else:
em.title = f'{assigned_to.display_name} is not an admin in this guild.'
else:
- requests = self.bot.con.all('select * from admin_requests where issuing_member_id = %(member_id)s and guild_orig = %(guild_id)s and completed_time is null',
- {'member_id': ctx.author.id, 'guild_id': ctx.guild.id})
+ requests = self.bot.con.all('select * from admin_requests where issuing_member_id = %(member_id)s '
+ 'and guild_orig = %(guild_id)s and completed_time is null',
+ {'member_id': ctx.author.id, 'guild_id': ctx.guild.id})
em.title = f'Admin help requests for {ctx.author.display_name}'
if requests:
for request in requests:
admin = discord.utils.get(ctx.guild.members, id=request[2])
- em.add_field(name=f"Request ID: {request[0]}{' Assigned to: ' + admin.display_name if admin else ''}", value=f"{request[4]}\nRequested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT\n", inline=False)
+ em.add_field(name=f"Request ID: {request[0]}"
+ f"{' Assigned to: ' + admin.display_name if admin else ''}",
+ value=f"""{request[4]}
+ Requested on: {datetime.strftime(request[5], '%Y-%m-%d at %H:%M:%S')} GMT
+ """,
+ inline=False)
else:
- em.add_field(name='You have no pending Admin Help requests.', value='To submit a request please use `admin new `', inline=False)
+ em.add_field(name='You have no pending Admin Help requests.',
+ value='To submit a request please use `admin new `',
+ inline=False)
await ctx.send(embed=em)
@admin.command(name='close')
async def close_request(self, ctx, *, request_ids=None):
- '''Allows Admin to close admin help tickets.
+ """Allows Admin to close admin help tickets.
[request_id] must be a valid integer pointing to an open Request ID
- '''
+ """
if checks.is_admin(self.bot, ctx) or checks.is_rcon_admin(self.bot, ctx):
if request_ids:
- request_ids = request_ids.replace(' ','').split(',')
+ request_ids = request_ids.replace(' ', '').split(',')
for request_id in request_ids:
try:
request_id = int(request_id)
- except:
+ except Exception:
await ctx.send(f'{request_id} is not a valid request id.')
else:
- request = self.bot.con.one(f'select * from admin_requests where id = %(request_id)s', {'request_id': request_id})
+ request = self.bot.con.one(f'select * from admin_requests where id = %(request_id)s',
+ {'request_id': request_id})
if request:
if request[3] == ctx.guild.id:
- if request[6] == None:
- self.bot.con.run('update admin_requests set completed_time = %(time_now)s where id = %(request_id)s', {'time_now': ctx.message.created_at, 'request_id': request_id})
- await ctx.send(f'Request {request_id} by {ctx.guild.get_member(request[1]).display_name} has been marked complete.')
+ if request[6] is None:
+ self.bot.con.run('update admin_requests set completed_time = %(time_now)s where '
+ 'id = %(request_id)s',
+ {'time_now': ctx.message.created_at, 'request_id': request_id})
+ await ctx.send(f'Request {request_id} by '
+ f'{ctx.guild.get_member(request[1]).display_name}'
+ f' has been marked complete.')
else:
await ctx.send(f'Request {request_id} is already marked complete.')
else:
@@ -308,40 +392,43 @@ class utils():
@commands.command(name='weather', aliases=['wu'])
@commands.cooldown(5, 15, type=commands.BucketType.default)
async def get_weather(self, ctx, *, location='palmer ak'):
- '''Gets the weather data for the location provided,
+ """Gets the weather data for the location provided,
If no location is included then it will get the weather for the Bot's home location.
- '''
+ """
try:
url = f'http://autocomplete.wunderground.com/aq?query={location}&format=JSON'
with async_timeout.timeout(10):
async with self.bot.aio_session.get(url) as response:
- data = await response.json()
+ data = await response.json()
link = data['RESULTS'][0]['l']
url = f'http://api.wunderground.com/api/88e14343b2dd6d8e/geolookup/conditions/{link}.json'
with async_timeout.timeout(10):
async with self.bot.aio_session.get(url) as response:
- data = json.loads(await response.text())
+ data = json.loads(await response.text())
utils_log.info(data)
em = discord.Embed()
em.title = f"Weather for {data['current_observation']['display_location']['full']}"
em.url = data['current_observation']['forecast_url']
em.description = data['current_observation']['observation_time']
em.set_thumbnail(url=data['current_observation']['icon_url'])
- em.set_footer(text='Data provided by wunderground.com', icon_url=data['current_observation']['image']['url'])
+ em.set_footer(text='Data provided by wunderground.com',
+ icon_url=data['current_observation']['image']['url'])
value_str = f'''```
{'Temp:':<20}{data['current_observation']['temperature_string']:<22}
{'Feels Like:':<20}{data['current_observation']['feelslike_string']:<22}
{'Relative Humidity:':<20}{data['current_observation']['relative_humidity']:<22}
{'Wind:':<5}{data['current_observation']['wind_string']:^44}
```'''
- em.add_field(name=f"Current Conditions: {data['current_observation']['weather']}", value=value_str, inline=False)
+ em.add_field(name=f"Current Conditions: {data['current_observation']['weather']}",
+ value=value_str,
+ inline=False)
await ctx.send(embed=em)
except IndexError:
await ctx.send('Can\'t find that location, please try again.')
- @commands.command(name='localtime', aliases=['time','lt'])
+ @commands.command(name='localtime', aliases=['time', 'lt'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
- async def get_localtime(self, ctx, timezone:str='Anchorage'):
+ async def get_localtime(self, ctx, timezone: str='Anchorage'):
em = discord.Embed()
try:
tz = pytz.timezone(timezone)
@@ -365,19 +452,21 @@ class utils():
@commands.command(name='purge', aliases=['clean', 'erase'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
- async def purge_messages(self, ctx, number:int=20, member:discord.Member=None):
+ async def purge_messages(self, ctx, number: int=20, member: discord.Member=None):
def is_me(message):
if message.author == self.bot.user:
return True
- prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ prefixes = self.bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id': ctx.guild.id})
if prefixes:
for prefix in prefixes:
if message.content.startswith(prefix):
return True
return False
return message.content.startswith(self.bot.default_prefix)
+
def is_member(message):
return message.author == member
+
def is_author(message):
return message.author == ctx.author
@@ -394,9 +483,9 @@ class utils():
em.description = f'Deleted {len(deleted)} messages.'
await ctx.send(embed=em, delete_after=5)
- @commands.command(name='purge_all', aliases=['cls','clear'])
+ @commands.command(name='purge_all', aliases=['cls', 'clear'])
@commands.cooldown(1, 3, type=commands.BucketType.user)
- async def purge_all(self, ctx, number:int=20, contents:str='all'):
+ async def purge_all(self, ctx, number: int=20, contents: str='all'):
if checks.is_admin(self.bot, ctx):
if contents != 'all':
deleted = await ctx.channel.purge(limit=number, check=lambda message: message.content == contents)
@@ -424,7 +513,7 @@ class utils():
async def google_sheets(self, ctx, member: discord.Member):
if checks.is_admin(self.bot, ctx):
scope = ['https://spreadsheets.google.com/feeds',
- 'https://www.googleapis.com/auth/drive']
+ 'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('config/google_client_secret.json', scope)
gc = gspread.authorize(credentials)
sh = gc.open_by_key('128GnQPOx0u7oPGvu5nAJks_Qv2R0Ru9ILAniICoxhJ8')
@@ -436,10 +525,15 @@ class utils():
em = discord.Embed()
em.title = f'User Data from Whitelist Sheet'
em.colour = embed_color
- for i,name in enumerate(names):
- if member.name.lower() in name.lower() or member.display_name.lower() in name.lower() or name.lower() in member.name.lower() or name.lower() in member.display_name.lower():
- em.add_field(name=name, value=f'Steam ID: {steam[i]}\nPatreon Level: {tier[i]}\nPatron of: {patron[i]}')
+ for i, name in enumerate(names):
+ if member.name.lower() in name.lower()\
+ or member.display_name.lower() in name.lower()\
+ or name.lower() in member.name.lower()\
+ or name.lower() in member.display_name.lower():
+ em.add_field(name=name,
+ value=f'Steam ID: {steam[i]}\nPatreon Level: {tier[i]}\nPatron of: {patron[i]}')
await ctx.send(embed=em)
+
def setup(bot):
- bot.add_cog(utils(bot))
+ bot.add_cog(Utils(bot))
diff --git a/geeksbot.py b/geeksbot.py
index 7131e34..757ac71 100644
--- a/geeksbot.py
+++ b/geeksbot.py
@@ -1,11 +1,10 @@
-import discord
+from typing import Dict
+
from discord.ext import commands
import logging
from datetime import datetime
-import json, asyncio
-from srcds import rcon as rcon_con
-import re, aiohttp, async_timeout
-from bs4 import BeautifulSoup as bs
+import json
+import aiohttp
from postgres import Postgres
from collections import deque
from googleapiclient.discovery import build
@@ -32,16 +31,15 @@ bot_config_file = 'bot_config.json'
secrets_file = 'bot_secrets.json'
profane_words_file = 'profane_words'
-emojis = {
+emojis: Dict[str, str] = {
'x': '❌',
'y': '✅',
'poop': '💩',
}
-
-
description = 'I am Geeksbot! Fear me!'
+
class Geeksbot(commands.Bot):
def __init__(self, **kwargs):
kwargs["command_prefix"] = self.get_custom_prefix
@@ -57,24 +55,31 @@ class Geeksbot(commands.Bot):
self.infected = {}
self.TOKEN = self.bot_secrets['token']
del self.bot_secrets['token']
- self.con = Postgres(f"host={self.bot_secrets['db_con']['host']} port={self.bot_secrets['db_con']['port']} dbname={self.bot_secrets['db_con']['db_name']} connect_timeout=10 user={self.bot_secrets['db_con']['user']} password={self.bot_secrets['db_con']['password']}")
+ self.con = Postgres(f" host={self.bot_secrets['db_con']['host']}\
+ port={self.bot_secrets['db_con']['port']}\
+ dbname={self.bot_secrets['db_con']['db_name']}\
+ connect_timeout=10 user={self.bot_secrets['db_con']['user']}\
+ password={self.bot_secrets['db_con']['password']}")
del self.bot_secrets['db_con']
self.default_prefix = 'g$'
self.voice_chans = {}
self.spam_list = {}
self.gcs_service = build('customsearch', 'v1', developerKey=self.bot_secrets['google_search_key'])
- async def get_custom_prefix(self, bot, message):
- return self.con.one('select prefix from guild_config where guild_id = %(id)s', {'id': message.guild.id}) or self.default_prefix
+ async def get_custom_prefix(self, bot_inst, message):
+ return self.con.one('select prefix from guild_config where guild_id = %(id)s', {'id': message.guild.id})\
+ or self.default_prefix
- async def load_ext(self, ctx, mod):
- bot.load_extension('{0}.{1}'.format(extension_dir,mod))
- if ctx != None:
+ @staticmethod
+ async def load_ext(self, ctx, mod=None):
+ self.load_extension('{0}.{1}'.format(extension_dir, mod))
+ if ctx is not None:
await ctx.send('{0} loaded.'.format(mod))
- async def unload_ext(self, ctx, mod):
- bot.unload_extension('{0}.{1}'.format(extension_dir,mod))
- if ctx != None:
+ @staticmethod
+ async def unload_ext(self, ctx, mod=None):
+ self.unload_extension('{0}.{1}'.format(extension_dir, mod))
+ if ctx is not None:
await ctx.send('{0} unloaded.'.format(mod))
async def close(self):
@@ -84,40 +89,47 @@ class Geeksbot(commands.Bot):
bot = Geeksbot(description=description, case_insensitive=True)
+
@bot.command(hidden=True)
@commands.is_owner()
-async def load(ctx, mod):
- 'Allows the owner to load extensions dynamically'
+async def load(ctx, mod=None):
+ """Allows the owner to load extensions dynamically"""
await bot.load_ext(ctx, mod)
+
@bot.command(hidden=True)
@commands.is_owner()
async def reload(ctx, mod=None):
- '''Allows the owner to reload extensions dynamically'''
+ """Allows the owner to reload extensions dynamically"""
if mod == 'all':
load_list = bot.bot_config['load_list']
for load_item in load_list:
- await bot.unload_ext(ctx,f'{load_item}')
- await bot.load_ext(ctx,f'{load_item}')
+ await bot.unload_ext(ctx, f'{load_item}')
+ await bot.load_ext(ctx, f'{load_item}')
else:
await bot.unload_ext(ctx, mod)
await bot.load_ext(ctx, mod)
+
@bot.command(hidden=True)
@commands.is_owner()
async def unload(ctx, mod):
- 'Allows the owner to unload extensions dynamically'
+ """Allows the owner to unload extensions dynamically"""
await bot.unload_ext(ctx, mod)
+
@bot.event
async def on_message(ctx):
if not ctx.author.bot:
if ctx.guild:
- if int(bot.con.one(f"select channel_lockdown from guild_config where guild_id = %(id)s", {'id':ctx.guild.id})):
- if ctx.channel.id in json.loads(bot.con.one(f"select allowed_channels from guild_config where guild_id = %(id)s", {'id':ctx.guild.id})):
+ if int(bot.con.one(f"select channel_lockdown from guild_config where guild_id = %(id)s",
+ {'id': ctx.guild.id})):
+ if ctx.channel.id in json.loads(bot.con.one(f"select allowed_channels from guild_config "
+ f"where guild_id = %(id)s",
+ {'id': ctx.guild.id})):
await bot.process_commands(ctx)
elif ctx.channel.id == 418452585683484680:
- prefix = bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id':ctx.guild.id})
+ prefix = bot.con.one('select prefix from guild_config where guild_id = %(id)s', {'id': ctx.guild.id})
prefix = prefix[0] if prefix else bot.default_prefix
ctx.content = f'{prefix}{ctx.content}'
await bot.process_commands(ctx)
@@ -126,6 +138,7 @@ async def on_message(ctx):
else:
await bot.process_commands(ctx)
+
@bot.event
async def on_ready():
bot.recent_msgs = {}
@@ -134,7 +147,7 @@ async def on_ready():
logging.info('Logged in as {0.name}|{0.id}'.format(bot.user))
load_list = bot.bot_config['load_list']
for load_item in load_list:
- await bot.load_ext(None,f'{load_item}')
+ await bot.load_ext(None, f'{load_item}')
logging.info('Extension Loaded: {0}'.format(load_item))
logging.info('Done loading, Geeksbot is active.')
with open(f'{config_dir}reboot', 'r') as f: