diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | base.py | 23 | ||||
-rw-r--r-- | bot.py | 57 | ||||
-rw-r--r-- | commands/basic_games.py | 73 | ||||
-rw-r--r-- | commands/economy.py | 42 | ||||
-rw-r--r-- | config.yaml.example | 8 | ||||
-rw-r--r-- | initialise_db.py | 43 | ||||
-rw-r--r-- | models/user.py | 28 | ||||
-rw-r--r-- | requirements.txt | 3 |
9 files changed, 278 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b6b072 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.yaml @@ -0,0 +1,23 @@ +from peewee import MySQLDatabase, Model +import yaml + + +with open("config.yaml", "r") as yamlfile: + config = yaml.load(yamlfile, Loader=yaml.CLoader) + print("Read config successful") + config = config + + +db_conf = config["database"] +db = MySQLDatabase( + db_conf["name"], + user=db_conf["username"], + password=db_conf["password"], + host=db_conf["host"], +) +db.connect() + + +class BaseModel(Model): + class Meta: + database = db @@ -0,0 +1,57 @@ +import discord +import yaml +import datetime +from discord_slash import SlashContext, SlashCommand +from discord.ext.commands import Bot +from models.user import User + + +with open("config.yaml", "r") as yamlfile: + config = yaml.load(yamlfile, Loader=yaml.CLoader) + print("Read config successful") + config = config + + +intents = discord.Intents.default() +intents.members = True + +bot = Bot(command_prefix="!", self_bot=True, intents=intents) + +slash = SlashCommand(bot, sync_commands=True) + + +# Runs once bot has connected to discord +@bot.event +async def on_ready(): + time_now = datetime.datetime.utcnow() + print(f"{time_now}: {bot.user} has connected to Discord!") + + for guild in bot.guilds: + if guild.id == config["discord_server_id"]: + print(f"{time_now}: {bot.user} has joined {guild.name}!") + for channel in guild.channels: + if channel.name == config["discord_channel"]: + print(f"{time_now}: Found channel {channel.name}!") + + +@bot.event +async def on_message(message): + print(message.author.id) + user = User.get(User.discord_id == message.author.id) + user.add_message() + print(user.display_name) + + +@slash.slash( + name="test", + description="This is just a test command, nothing more.", + guild_ids=[config["discord_server_id"]], +) +async def test(ctx: SlashContext): + print("test") + await ctx.send(content="Beep boop") + + +bot.load_extension("commands.economy") +bot.load_extension("commands.basic_games") +bot.run(config["discord_token"]) diff --git a/commands/basic_games.py b/commands/basic_games.py new file mode 100644 index 0000000..0b594ba --- /dev/null +++ b/commands/basic_games.py @@ -0,0 +1,73 @@ +from discord.ext.commands import Bot, Cog +from discord_slash import cog_ext, SlashContext +from discord_slash.utils.manage_commands import create_option, create_choice +from base import config +from models.user import User +import random +import yaml + + +class BasicGames(Cog): + def __init__(self, bot: Bot): + self.bot = bot + with open("config.yaml", "r") as yamlfile: + config = yaml.load(yamlfile, Loader=yaml.CLoader) + print("Read config successful") + self.config = config + + @cog_ext.cog_slash( + name="coin_flip", + description="Flip a coin", + guild_ids=[config["discord_server_id"]], + options=[ + create_option( + name="num_coins", + description="coins to bet", + option_type=4, + required=True, + ), + create_option( + name="choice", + description="heads or tails?", + option_type=3, + required=True, + choices=[ + create_choice(name="Heads", value="Heads"), + create_choice(name="Tails", value="Tails"), + ], + ), + ], + ) + async def coin_flip(self, ctx: SlashContext, num_coins: int, choice: int): + user = User.get(User.discord_id == ctx.author_id) + + await ctx.send(content=f"{user.username} is betting {num_coins} coins on {choice}") + result = random.randrange(0, 1) + choices = ["Heads", "Tails"] + await ctx.send(content=f"Coin flip lands on {choices[result]}") + if choice == choices[result]: + await ctx.send(content=f"You win {num_coins * 2} coins!") + user.add_coins(num_coins * 2) + else: + await ctx.send(content=f"You lose {num_coins} coins :(") + user.remove_coins(num_coins) + + user.save() + + @cog_ext.cog_slash( + name="dice", + description="Roll some dice.", + guild_ids=[config["discord_server_id"]], + ) + async def dice(self, ctx: SlashContext): + print("dice") + user = User.get(User.discord_id == ctx.author_id) + result = random.randrange(1, 6) + await ctx.send(content=f"{user.display_name}, you roll a {result}") + + +def setup(bot): + bot.add_cog(BasicGames(bot)) + + print("Loaded BasicGames") + print(config["discord_server_id"]) diff --git a/commands/economy.py b/commands/economy.py new file mode 100644 index 0000000..1960827 --- /dev/null +++ b/commands/economy.py @@ -0,0 +1,42 @@ +from discord.ext.commands import Bot, Cog +from discord_slash import cog_ext, SlashContext +from base import config +from models.user import User +import random +import yaml + + +class Economy(Cog): + def __init__(self, bot: Bot): + self.bot = bot + with open("config.yaml", "r") as yamlfile: + config = yaml.load(yamlfile, Loader=yaml.CLoader) + print("Read config successful") + self.config = config + print(config["discord_server_id"]) + + @cog_ext.cog_slash( + name="daily", + description="Get some coins.", + guild_ids=[config["discord_server_id"]], + ) + async def daily(self, ctx: SlashContext): + user = User.get(User.discord_id == ctx.author_id) + num_coins = random.randrange(50, 100) + user.add_coins(num_coins) + user.save() + await ctx.send(content="Here have some coins") + + @cog_ext.cog_slash( + name="coins", + description="Check your coins.", + guild_ids=[config["discord_server_id"]], + ) + async def coins(self, ctx: SlashContext): + user = User.get(User.discord_id == ctx.author_id) + await ctx.send(content=f"{user.display_name}, you have {user.currency} coins") + + +def setup(bot): + bot.add_cog(Economy(bot)) + print("Loaded Economy") diff --git a/config.yaml.example b/config.yaml.example new file mode 100644 index 0000000..fde09d7 --- /dev/null +++ b/config.yaml.example @@ -0,0 +1,8 @@ +discord_server_id: 1224324325325 +discord_token: mysecrettoken +discord_channel: channel-name +database: + host: 1.2.3.4 + username: user + password: pass + name: name diff --git a/initialise_db.py b/initialise_db.py new file mode 100644 index 0000000..62e6316 --- /dev/null +++ b/initialise_db.py @@ -0,0 +1,43 @@ +from models.user import User +from mee6_py_api import API +from base import db, config, client +import datetime + + +# Runs once bot has connected to discord +@client.event +async def on_ready(): + + db.create_tables([User]) + time_now = datetime.datetime.utcnow() + print(f"{time_now}: {client.user} has connected to Discord!") + users = [] + for guild in client.guilds: + if guild.id == config["discord_server_id"]: + print(f"{time_now}: {client.user} has joined {guild.name}!") + for member in guild.members: + print(member) + print(member.display_name) + print(member.nick) + print(member.joined_at) + users.append( + User( + username=member.name, + display_name=member.display_name, + discord_id=member.id, + joined_date=member.joined_at, + ) + ) + mee6API = API(config["discord_server_id"]) + mee6_levels = await mee6API.levels.get_leaderboard_page(0) + for user in users: + for mee6_user in mee6_levels["players"]: + if mee6_user["username"] == user.username: + user.level = mee6_user["level"] + user.exp = mee6_user["xp"] + user.message_count = mee6_user["message_count"] + print(user) + user.save() + + +client.run(config["discord_token"]) diff --git a/models/user.py b/models/user.py new file mode 100644 index 0000000..dcf35ab --- /dev/null +++ b/models/user.py @@ -0,0 +1,28 @@ +from peewee import TextField, IntegerField, DateTimeField +import datetime +import random + +from base import BaseModel + + +class User(BaseModel): + + username = TextField() + display_name = TextField() + discord_id = TextField() + level = IntegerField() + exp = IntegerField() + currency = IntegerField() + message_count = IntegerField() + joined_date = DateTimeField(default=datetime.datetime.now) + + def add_coins(self, additional_coins: int): + self.currency = self.currency + additional_coins + + def remove_coins(self, lost_coins: int): + self.currency = self.currency - lost_coins + + def add_message(self): + self.message_count += 1 + gained_exp = random.randrange(10, 15) + self.exp += gained_exp diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1cba5ab --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +discord +discord-py-interactions +peewee
\ No newline at end of file |