FurrMula-Bot/bot.py

159 lines
5.8 KiB
Python

import shelve
from discord import NotFound, InvalidArgument
from discord.ext import commands
bot = commands.Bot(command_prefix="%")
def set_config(guild, conf):
print(f"Set config for {guild.name}")
conf[str(guild.id)] = dict()
for opt in [["default_role_id", ""], ["reaction_messages", dict()]]:
conf[str(guild.id)][opt[0]] = opt[1]
@bot.event
async def on_ready():
with shelve.open("config.conf", writeback=True) as conf:
for g in bot.guilds:
if str(g.id) not in conf:
set_config(g, conf)
print("FurrMula Bot online !")
@bot.event
async def on_guild_join(guild):
with shelve.open("config.conf", writeback=True) as conf:
set_config(guild, conf)
@bot.event
async def on_member_join(member):
with shelve.open("config.conf") as conf:
if "default_role_id" in conf[str(member.guild.id)] and conf[str(member.guild.id)]["default_role_id"]:
role = member.guild.get_role(conf[str(member.guild.id)]["default_role_id"])
await member.add_roles(role)
@bot.event
async def on_raw_reaction_add(payload):
guild = bot.get_guild(payload.guild_id)
member = guild.get_member(payload.user_id)
await reaction_role(payload.message_id, guild, str(payload.emoji), member, True)
@bot.event
async def on_raw_reaction_remove(payload):
guild = bot.get_guild(payload.guild_id)
member = guild.get_member(payload.user_id)
await reaction_role(payload.message_id, guild, str(payload.emoji), member, False)
async def reaction_role(message_id, guild, emoji, member, state):
with shelve.open("config.conf") as conf:
if not member.bot and \
"reaction_messages" in conf[str(guild.id)] and \
message_id in conf[str(guild.id)]["reaction_messages"] and \
emoji in conf[str(guild.id)]["reaction_messages"][message_id]:
role = guild.get_role(conf[str(guild.id)]["reaction_messages"][message_id][emoji])
if state:
await member.add_roles(role)
else:
await member.remove_roles(role)
@bot.command()
async def shutdown(ctx):
if await bot.is_owner(ctx.author):
await ctx.send("Shutdown !")
await bot.logout()
await bot.close()
else:
await ctx.send("Not allowed !")
@bot.command()
@commands.guild_only()
async def set_default_role(ctx):
with shelve.open("config.conf", writeback=True) as conf:
if len(ctx.message.role_mentions) == 1:
conf[str(ctx.guild.id)]["default_role_id"] = ctx.message.role_mentions[0].id
await ctx.send(f"Role ``{ctx.message.role_mentions[0].name}`` set to default role")
elif len(ctx.message.role_mentions) == 0:
conf[str(ctx.guild.id)]["default_role_id"] = ""
await ctx.send("Default role disabled")
else:
await ctx.send("Too many roles !")
@bot.command()
@commands.guild_only()
async def default_role(ctx):
with shelve.open("config.conf") as conf:
await ctx.send(conf[str(ctx.guild.id)]["default_role_id"])
@bot.command()
@commands.guild_only()
async def reaction_message(ctx, state=None, message_id=None, reaction=None):
if state not in ["set", "unset", "add", "remove"]:
await ctx.send("Wrong argument !")
else:
try:
message = await ctx.fetch_message(int(message_id))
except (TypeError, ValueError, NotFound):
await ctx.send("Invalid message ID !")
else:
with shelve.open("config.conf", writeback=True) as conf:
if state == "set":
if message.id in conf[str(ctx.guild.id)]["reaction_messages"]:
await ctx.send("Message already set !")
else:
conf[str(ctx.guild.id)]["reaction_messages"][message.id] = dict()
await ctx.send("Message set")
elif state == "unset":
try:
del conf[str(ctx.guild.id)]["reaction_messages"][message.id]
except KeyError:
await ctx.send("Message not set !")
else:
await ctx.send("Message remove")
else:
if message.id not in conf[str(ctx.guild.id)]["reaction_messages"]:
await ctx.send("Message not set !")
else:
if state == "add":
if len(ctx.message.role_mentions) != 1:
await ctx.send("Invalid role !")
else:
try:
await message.add_reaction(reaction)
except InvalidArgument:
await ctx.send("Invalid reaction !")
else:
conf[str(ctx.guild.id)]["reaction_messages"][message.id][reaction] =\
ctx.message.role_mentions[0].id
await ctx.send("Reaction add")
if state == "remove":
try:
await message.remove_reaction(reaction, bot.user)
except (InvalidArgument, NotFound):
await ctx.send("Invalid reaction !")
else:
del conf[str(ctx.guild.id)]["reaction_messages"][message.id][reaction]
await ctx.send("Reaction remove")
@bot.command()
async def debug(ctx, config=None):
with shelve.open("config.conf") as conf:
data = conf[str(ctx.guild.id)]
if config:
data = data[config]
print(data)
await ctx.send(f"``{data}``")
bot.run(open("token.ini").read())