From c7fc1ba0fb3a0ce62637536e4f95a10b39f9abee Mon Sep 17 00:00:00 2001 From: henceiusegentoo Date: Sun, 6 Aug 2023 02:14:46 +0200 Subject: [PATCH] Added the auto-credit-system --- api/config/credits.yml | 3 +- credit_management/autocredits.py | 12 ++++++++ credit_management/main.py | 51 ++++++++++++++++++++++++++++++++ credit_management/role_bot.py | 38 ++++++++++++++++++++++++ credit_management/settings.py | 13 ++++++++ 5 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 credit_management/autocredits.py create mode 100644 credit_management/main.py create mode 100644 credit_management/role_bot.py create mode 100644 credit_management/settings.py diff --git a/api/config/credits.yml b/api/config/credits.yml index fa2449b..7025e66 100644 --- a/api/config/credits.yml +++ b/api/config/credits.yml @@ -18,7 +18,6 @@ bonuses: helper: 0.4 booster: 0.5 -# discord reward 0.99^lvl? rewards: - day: 250 + day: 250 # scales with level. More in ../../credit_management/settings.py \ No newline at end of file diff --git a/credit_management/autocredits.py b/credit_management/autocredits.py new file mode 100644 index 0000000..e30fb23 --- /dev/null +++ b/credit_management/autocredits.py @@ -0,0 +1,12 @@ +async def get_all_users(client): + users = client['nova-core']['users'] + return users + +async def update_credits(users, settings = None): + if not settings: + users.update_many({}, {"$inc": {"credits": 250}}) + + else: + for key, value in settings.items(): + users.update_many({'role': key}, {"$inc": {"credits": int(value)}}) + print(f"Updated {key} to {value}") \ No newline at end of file diff --git a/credit_management/main.py b/credit_management/main.py new file mode 100644 index 0000000..f6a0148 --- /dev/null +++ b/credit_management/main.py @@ -0,0 +1,51 @@ +import asyncio +from settings import roles +import autocredits +import aiohttp +from dotenv import load_dotenv +import os +import pymongo + +load_dotenv() + +CONNECTION_STRING = os.getenv("CONNECTION_STRING") +pymongo_client = pymongo.MongoClient(CONNECTION_STRING) + +async def main(): + users = await autocredits.get_all_users(pymongo_client) + + await update_roles(users) + await autocredits.update_credits(users, roles) + +async def update_roles(users): + async with aiohttp.ClientSession() as session: + try: + async with session.get('http://localhost:50000/get_roles') as response: + data = await response.json() + except aiohttp.ClientError as e: + print(f"Error: {e}") + return + + lvlroles = [f"lvl{lvl}" for lvl in range(10, 110, 10)] + [''] + discord_users = data + users = await autocredits.get_all_users(pymongo_client) + + filtered_users = users.find({'role': {'$in': lvlroles}}) + + bulk_updates = [] + for user in filtered_users: + discord = str(user['auth']['discord']) + + for id_, roles in discord_users.items(): + if id_ == discord: + for role in lvlroles: + if role in roles: + bulk_updates.append(pymongo.UpdateOne({'auth.discord': int(discord)}, {'$set': {'role': role}})) + print(f"Updated {id_} to {role}") + break + if bulk_updates: + with pymongo_client: + users.bulk_write(bulk_updates) + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/credit_management/role_bot.py b/credit_management/role_bot.py new file mode 100644 index 0000000..954e6fa --- /dev/null +++ b/credit_management/role_bot.py @@ -0,0 +1,38 @@ +import nextcord +import aiohttp.web +from dotenv import load_dotenv +import os + +load_dotenv() + +TOKEN = os.getenv("BOT_TOKEN") +GUILD_ID = os.getenv("GUILD_ID") + +client = nextcord.Client(intents=nextcord.Intents.all()) + +@client.event +async def on_ready(): + # start webserver using aiohttp + app = aiohttp.web.Application() + + async def get_roles(request): + return aiohttp.web.json_response(await get_userinfo()) + + app.router.add_get('/get_roles', get_roles) + + runner = aiohttp.web.AppRunner(app) + await runner.setup() + site = aiohttp.web.TCPSite(runner, 'localhost', 50000) + await site.start() + + print('Bot is ready') + + +async def get_userinfo(): + guild = client.get_guild(int(GUILD_ID)) + members = guild.members + + user_roles = {member.id: [role.name for role in member.roles] for member in members} + return user_roles + +client.run(TOKEN) \ No newline at end of file diff --git a/credit_management/settings.py b/credit_management/settings.py new file mode 100644 index 0000000..be73b94 --- /dev/null +++ b/credit_management/settings.py @@ -0,0 +1,13 @@ +roles = { + '': '250', + 'lvl10': '280', + 'lvl20': '310', + 'lvl30': '340', + 'lvl40': '370', + 'lvl50': '400', + 'lvl60': '430', + 'lvl70': '460', + 'lvl80': '490', + 'lvl90': '520', + 'lvl100': '550', +} \ No newline at end of file