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  | 
