import discord import os import threading from discord.ext import commands import json import datetime import requests import os.path import random import gspread import re import asyncio import csv from tabulate import tabulate import gradio_client import gradio as gr from gradio_client import Client from huggingface_hub import HfApi, list_models, list_liked_repos, list_metrics DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None) intents = discord.Intents.all() bot = commands.Bot(command_prefix='!', intents=intents) """""" XP_PER_MESSAGE = 10 # 100k messages = 1M exp = lvl 100 """""" service_account = json.loads(os.environ.get('KEY')) file_path = 'service_account.json' with open(file_path, 'w') as json_file: json.dump(service_account, json_file) gspread_bot = gspread.service_account(filename='service_account.json') #worksheet = gspread_bot.open("levelbot").sheet1 #worksheet2 = gspread_bot.open("hf_discord_verified_users_test").sheet1 """""" bot_ids = [1136614989411655780, 1166392942387265536, 1158038249835610123, 1130774761031610388, 1155489509518098565, 1155169841276260546, 1152238037355474964, 1154395078735953930] """""" api = HfApi() """""" @bot.event async def on_ready(): print(f'Logged in as {bot.user.name}') print(f"XP_PER_MESSAGE: {XP_PER_MESSAGE}") def calculate_level(xp): return int(xp ** (1.0 / 3.0)) def calculate_xp(level): return (int(level ** 3)) """ async def search_csv(file_path, column_index, search_value): with open(file_path, 'r', newline='') as csvfile: reader = csv.reader(csvfile) first_row = next(reader) print(first_row) for row in reader: if row and len(row) > column_index and row[column_index] == search_value: print(row) def is_csv_empty(file_path): if not os.path.isfile(file_path): print(f"The file '{file_path}' does not exist.") return False with open(file_path, 'r', newline='') as csvfile: reader = csv.reader(csvfile) try: first_row = next(reader) print(first_row) except StopIteration: print(f"The file '{file_path}' is empty.") return False if not any(first_row): print(f"The file '{file_path}' has no data.") return False return True """ def blocking_io(member_id): worksheet = gspread_bot.open("levelbot").sheet1 guild = bot.get_guild(879548962464493619) member = guild.get_member(member_id) print(f" {member}") print(f"2") cell = worksheet.find(str(member.id)) length = len(worksheet.col_values(1)) print(f"3") if cell is None: print(f"creating new record for {member}") # if not, create new record string_member_id = str(member.id) xp = 10 current_level = calculate_level(xp) member_name = member.name worksheet.update(values=[[string_member_id, member_name, xp, current_level]], range_name=f'A{length+1}:D{length+1}') # initial role assignment if current_level == 1: if lvl1 not in member.roles: return(1) else: print(f"4") if cell: # if so, update that row... xp = worksheet.cell(cell.row, cell.col+2).value xp = int(xp) + XP_PER_MESSAGE current_level = calculate_level(xp) print(f"updating record for {member}: {xp} xp") # write with added xp worksheet.update(values=[[xp, current_level]], range_name=f'C{cell.row}:D{cell.row}') # level up print(f"current_level: {current_level}") if current_level >= 2 and current_level <=30: # pass current_level as int? return(current_level) async def add_exp(member_id): try: loop = asyncio.get_running_loop() result = await loop.run_in_executor(None, blocking_io, member_id) guild = bot.get_guild(879548962464493619) member = guild.get_member(member_id) lvl1 = guild.get_role(1171861537699397733) lvl2 = guild.get_role(1171861595115245699) lvl3 = guild.get_role(1171861626715115591) lvl4 = guild.get_role(1171861657975259206) lvl5 = guild.get_role(1171861686580412497) lvl6 = guild.get_role(1171861900301172736) lvl7 = guild.get_role(1171861936258941018) lvl8 = guild.get_role(1171861968597024868) lvl9 = guild.get_role(1171862009982242836) lvl10 = guild.get_role(1164188093713223721) lvl11 = guild.get_role(1171524944354607104) lvl12 = guild.get_role(1171524990257082458) lvl13 = guild.get_role(1171525021928263791) lvl14 = guild.get_role(1171525062201966724) lvl15 = guild.get_role(1171525098465918996) lvl16 = guild.get_role(1176826165546201099) lvl17 = guild.get_role(1176826221301092392) lvl18 = guild.get_role(1176826260643659776) lvl19 = guild.get_role(1176826288816791693) lvl20 = guild.get_role(1176826319447801896) lvl21 = guild.get_role(1195030831174008902) lvl22 = guild.get_role(1195030883351150592) lvl23 = guild.get_role(1196055555006009445) lvl24 = guild.get_role(1196055640917938216) lvl25 = guild.get_role(1196055712506318869) lvl26 = guild.get_role(1196055775924195378) lvl27 = guild.get_role(1196055837018435664) lvl28 = guild.get_role(1196055908267081849) lvl29 = guild.get_role(1196055970804150352) lvl30 = guild.get_role(1196056027720847380) lvls = { 1: lvl1, 2: lvl2, 3: lvl3, 4: lvl4, 5: lvl5, 6: lvl6, 7: lvl7, 8: lvl8, 9: lvl9, 10: lvl10, 11: lvl11, 12: lvl12, 13: lvl13, 14: lvl14, 15: lvl15, 16: lvl16, 17: lvl17, 18: lvl18, 19: lvl19, 20: lvl20, 21: lvl21, 22: lvl22, 23: lvl23, 24: lvl24, 25: lvl25, 26: lvl26, 27: lvl27, 28: lvl28, 29: lvl29, 30: lvl30, } if result == 1: await member.add_roles(lvl1) print(f"Gave {member} {lvl1}") print(f"result: {result}") if result >= 2: current_level = result current_role = lvls[current_level] if current_role not in member.roles: await member.add_roles(current_role) print(f"Giving {member} {current_role}") await member.remove_roles(lvls[current_level-1]) print(f"Removed {lvls[current_level-1]} from {member}") #print(f"{member} Level up! {current_level-1} -> {current_level}!") if current_role in member.roles: await member.send(f"Level up! {current_level-1} -> {current_level}!") except Exception as e: print(f"add_exp Error: {e}") @bot.event async def on_message(message): try: if message.author.id not in bot_ids: print(f"adding exp from message {message.author}") await add_exp(message.author.id) #await periodic_api_test() # run this ~1 per day otherwise will lead to issues await bot.process_commands(message) except Exception as e: print(f"on_message Error: {e}") @bot.event async def on_reaction_add(reaction, user): try: if user.id not in bot_ids: print(f"adding exp from react {user.id}") await add_exp(user.id) except Exception as e: print(f"on_reaction_add Error: {e}") @bot.command(name='update_leaderboard') async def update_leaderboard(ctx): channel = bot.get_channel(1197143964994773023) message = await channel.fetch_message(1197146219802275840) new_leaderboard_data = [("User 1", 120), ("User 2", 90), ("User 3", 70)] new_table = tabulate(new_leaderboard_data, headers=["User", "Score"], tablefmt="plain") await message.edit(content=f"Updated Leaderboard:\n```\n{new_table}\n```") @bot.command(name='send_message') async def send_message(ctx): channel = ctx.channel leaderboard_data = [("User 1", 100), ("User 2", 80), ("User 3", 60)] table = tabulate(leaderboard_data, headers=["User", "Score"], tablefmt="plain") message = await channel.send(f"Leaderboard:\n```\n{table}\n```") """""" DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None) def run_bot(): bot.run(DISCORD_TOKEN) threading.Thread(target=run_bot).start() def greet(name): return "Hello " + name + "!" demo = gr.Interface(fn=greet, inputs="text", outputs="text") demo.launch()