async def nfo(self, ctx, sub, ident): """Create a DNS entry from an NFO name sub = DNS prefix, the part before .scgc.xyz ident = NFO Prefix/Identifier, the part before .game.nfoservers.com""" if checks.role_or_permissions( ctx, lambda r: r.name.lower() in ('monkey', 'server manager', 'owner')) is False: return False ip = await self.resolver.query("{}.game.nfoservers.com".format(ident), 'A') client = dns.Client(project=self.settings["project"][0], credentials=self.creds) zone = client.zone(self.settings['zone'][0], self.settings['domain'][0]) record_set = zone.resource_record_set( '{}.{}.'.format(sub, self.settings['domain'][0]), 'A', 60 * 60, [ip[0].host]) changes = zone.changes() changes.add_record_set(record_set) changes.create() while changes.status != 'done': asyncio.sleep(60) changes.reload() self.unk[sub] = {'dns': sub, 'nfo': ident, 'port': 0, 'name': 'unk'} dataIO.save_json(os.path.join("data", "dns", "unk.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say( "DNS Entry Created. Don't forget to update the server list, !serverlist edit {}" .format(sub))
async def a(self, ctx, sub, ip): """Create or Modify a DNS A Record sub = DNS prefix, the part before .scgc.xyz ip = IP the record should point to""" if checks.role_or_permissions( ctx, lambda r: r.name.lower() in ('monkey', 'server manager', 'owner')) is False: return False client = dns.Client(project=self.settings["project"][0], credentials=self.creds) zone = client.zone(self.settings['zone'][0], self.settings['domain'][0]) record_set = zone.resource_record_set( '{}.{}.'.format(sub, self.settings['domain'][0]), 'A', 60 * 60 * 2, [ip]) changes = zone.changes() changes.add_record_set(record_set) changes.create() while changes.status != 'done': asyncio.sleep(60) changes.reload() self.unk[sub] = {'dns': sub, 'nfo': ip, 'port': 0, 'name': 'unk'} dataIO.save_json(os.path.join("data", "dns", "unk.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say( "DNS Entry Created. Don't forget to update the server list if needed, !serverlist edit {}" .format(sub))
async def _dns(self, ctx): """Manage the DNS entries""" if checks.role_or_permissions( ctx, lambda r: r.name.lower() in ('monkey', 'server manager', 'owner')) is False: return False if ctx.invoked_subcommand is None: server = ctx.message.server await send_cmd_help(ctx)
async def chromosomes(self, ctx, *, member: discord.Member = None): """Check your or another users chromosomes. Will not display others' balances if inventory hiding is enabled.""" dest = ctx.channel if member is None: member = ctx.author gd = await self.bot.db.get_guild_data(ctx.guild) try: is_mod = checks.role_or_permissions( ctx, lambda r: r.name in ('Bot Mod', 'Bot Admin', 'Bot Moderator'), manage_server=True) except: is_mod = False hide = gd.get("hideinv", False) if not is_mod and hide: member = ctx.author if hide: dest = ctx.author bal = await ctx.bot.di.get_all_balances(member) data = """ You have:\t\t {} chromosomes In the ricefields:\t {} chromosomes Total:\t\t {} chromosomes """ embed = discord.Embed( description=(await _(ctx, data)).format( int(bal[0]) if int(bal[0]) == bal[0] else bal[0], int(bal[1]) if int(bal[1]) == bal[1] else bal[1], sum(bal)), color=randint(0, 0xFFFFFF), ) embed.set_author(name=member.display_name, icon_url=member.avatar_url) embed.set_thumbnail( url="https://www.biobm.com/images/chromosome-abstract.png") await dest.send(embed=embed)
async def inventory(self, ctx, *, member: discord.Member = None): dest = ctx.channel if member is None: member = ctx.author gd = await self.bot.db.get_guild_data(ctx.guild) try: is_mod = checks.role_or_permissions( ctx, lambda r: r.name in ('Bot Mod', 'Bot Admin', 'Bot Moderator'), manage_server=True) except: is_mod = False hide = gd.get("hideinv", False) if not is_mod and hide: member = ctx.author if hide: dest = ctx.author inv = await self.bot.di.get_inventory(member) if not inv: await dest.send(await _(ctx, "This inventory is empty!")) return fmap = map(lambda x: f"{x[0]} x{x[1]}", sorted(inv.items())) fmt = "\n".join(fmap) chunks = chunkn(fmt, 2000) # [("Items: ", v) for v in chunkn(fmt, 400)] for chunk in chunks: embed = discord.Embed(description="\n".join(chunk), color=randint(0, 0xFFFFFF)) embed.set_author(name=member.display_name, icon_url=member.avatar_url) try: await dest.send(embed=embed) except discord.Forbidden: await dest.send(chunk)
async def complexout(self, ctx, channel_id: str): """ puts the output for the current server in another server. This takes a channel ID Be careful with managing this """ server = ctx.message.server if server.id not in self.settings: self.initial_config(server.id) chan = discord.utils.get(self.bot.get_all_channels(), id=channel_id) if not (checks.is_owner_check(ctx) or checks.role_or_permissions(lambda r: r.name.lower( ) == settings.get_server_admin(chan.server).lower(), manage_server=True)): return await self.bot.say( "You don't have the right permissions in the destination serverto do that!" ) if chan.type != discord.ChannelType.text: return await self.bot.say("That isn't a text channel") if chan.id in self.settings[server.id]['output']: return await self.bot.say("Channel already set as output") if self.settings[server.id]['multiout']: self.settings[server.id]['output'].append(chan.id) self.save_json() return await self.bot.say("Channel added to output list") else: self.settings[server.id]['output'] = [chan.id] self.save_json() return await self.bot.say("Channel set as output")
async def edit(self, ctx, sub, game, port, name): """Modify entries on the Server List sub = DNS prefix, the part before .scgc.xyz game = gmod, csgo or tf2 port = Server Port (will be displayed if something other than 27015 name = Name to display on the !serverlist. Enclose in quotes if needed""" if checks.role_or_permissions( ctx, lambda r: r.name.lower() in ('monkey', 'server manager', 'owner')) is False: return False if game not in ('gmod', 'csgo', 'tf2'): await self.bot.say("Invalid game, please use gmod, csgo or tf2") if sub in self.unk: val = self.unk.pop(sub) val['port'] = port val['name'] = name if game == 'gmod': self.gmod[sub] = val dataIO.save_json(os.path.join("data", "dns", "gmod.json"), self.gmod) elif game == 'csgo': self.csgo[sub] = val dataIO.save_json(os.path.join("data", "dns", "csgo.json"), self.csgo) elif game == 'tf2': self.tf2[sub] = val dataIO.save_json(os.path.join("data", "dns", "tf2.json"), self.tf2) dataIO.save_json(os.path.join("data", "dns", "unk.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say("Edit successful") elif sub in self.gmod: if sub == 'gmod': self.gmod[sub]['port'] = port self.gmod[sub]['name'] = name dataIO.save_json(os.path.join("data", "dns", "gmod.json"), self.gmod) else: val = self.gmod.pop(sub) val['port'] = port val['name'] = name if game == 'csgo': self.csgo[sub] = val dataIO.save_json(os.path.join("data", "dns", "csgo.json"), self.csgo) elif game == 'tf2': self.tf2[sub] = val dataIO.save_json(os.path.join("data", "dns", "tf2.json"), self.tf2) dataIO.save_json(os.path.join("data", "dns", "gmod.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say("Edit successful") elif sub in self.csgo: if sub == 'csgo': self.csgo[sub]['port'] = port self.csgo[sub]['name'] = name dataIO.save_json(os.path.join("data", "dns", "csgo.json"), self.csgo) else: val = self.csgo.pop(sub) val['port'] = port val['name'] = name if game == 'gmod': self.gmod[sub] = val dataIO.save_json(os.path.join("data", "dns", "gmod.json"), self.gmod) elif game == 'tf2': self.tf2[sub] = val dataIO.save_json(os.path.join("data", "dns", "tf2.json"), self.tf2) dataIO.save_json(os.path.join("data", "dns", "csgo.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say("Edit successful") elif sub in self.tf2: if sub == 'tf2': self.tf2[sub]['port'] = port self.tf2[sub]['name'] = name dataIO.save_json(os.path.join("data", "dns", "tf2.json"), self.tf2) else: val = self.tf2.pop(sub) val['port'] = port val['name'] = name if game == 'csgo': self.csgo[sub] = val dataIO.save_json(os.path.join("data", "dns", "csgo.json"), self.csgo) elif game == 'gmod': self.gmod[sub] = val dataIO.save_json(os.path.join("data", "dns", "gmod.json"), self.gmod) dataIO.save_json(os.path.join("data", "dns", "tf2.json"), self.unk) self.settings['last'] = int(datetime.datetime.utcnow().timestamp()) dataIO.save_json(os.path.join("data", "dns", "settings.json"), self.settings) await self.bot.say("Edit successful") else: await self.bot.say("No server list entry found for that DNS name")