LevelBot / app.py
lunarflu's picture
lunarflu HF staff
switch
22d3c95 verified
raw
history blame
8.2 kB
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 logging
import time
import pandas as pd
from apscheduler.schedulers.background import BackgroundScheduler
from gspread_dataframe import get_as_dataframe, set_with_dataframe
from gspread_formatting.dataframe import format_with_dataframe
import numpy as np
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)
#logger = logging.getLogger(__name__)
#logging.basicConfig(level=logging.DEBUG)
""""""
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()
""""""
#csv_file = 'data.csv'
global_df = pd.DataFrame()
@bot.event
async def on_ready():
global global_df
print(f'Logged in as {bot.user.name}')
print(f"XP_PER_MESSAGE: {XP_PER_MESSAGE}")
# testing sheet -> read -> paste sheet
"""import data from google sheets -> HF Space .csv (doesn't make API call this way, as it's read-only)"""
data = pd.read_csv("https://docs.google.com/spreadsheets/d/1hQSsIg1Y9WdBF_CdNM1L1rUUREoxKqRTe3_ILo-WK8w/export?format=csv&gid=0")
data['discord_user_id'] = data['discord_user_id'].astype(str)
global_df = data
print(f"csv successfully retrieved: {global_df}")
#data.to_csv(csv_file, index=False)
async def update_google_sheet():
"""save data from HF Space -> google sheets (makes 1 API call)"""
print("test")
name = "levelbot"
worksheet = gspread_bot.open(name).sheet1
set_with_dataframe(worksheet, global_df)
print({f"Google sheet {name} successfully updated!"})
def calculate_level(xp):
return int(xp ** (1.0 / 3.0))
def calculate_xp(level):
return (int(level ** 3))
async def add_exp(member_id):
try:
global global_df
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,
}
member_found = False
for index, cell_value in global_df.iloc[:, 0].items():
if cell_value == member_id:
# if found, update that row...
member_found = True
print(f"Record for {member} found at row {index + 1}, column 1")
# increment the old experience value (better not to replace outright)
old_xp = global_df.loc[index, 'discord_exp']
print(old_xp)
new_xp = old_xp + XP_PER_MESSAGE
print(f"new_xp = old_xp + XP_PER_MESSAGE / {new_xp} = {old_xp} + {XP_PER_MESSAGE}")
global_df.loc[index, 'discord_exp'] = new_xp # do not change column name
print(f"Record for {member} updated from {old_xp} to {new_xp} (+{XP_PER_MESSAGE}) ")
print(f"Current value: {global_df.loc[index, 'discord_exp']}")
# level up
current_level = calculate_level(new_xp)
print(f"Current_level for {member}: {current_level}")
if current_level >= 2 and current_level <=30:
current_role = lvls[current_level]
if current_role not in member.roles:
await member.add_roles(current_role)
print(f"Level Up! Gave {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: # needs update; reference exp reward for verification
#await member.send(f"Level up! {current_level-1} -> {current_level}!")
if not member_found:
# if not, create new record
print(f"creating new record for {member}")
#string_member_id = str(member.id)
xp = 10 # define somewhere else?
current_level = calculate_level(xp)
member_name = member.name
row_data = [member_id, member_name, xp, current_level]
new_row_df = pd.DataFrame([row_data], columns=global_df.columns)
updated_df = global_df.append(new_row_df, ignore_index=True)
# initial role assignment
if current_level == 1:
if lvl1 not in member.roles:
await member.add_roles(lvl1)
print(f"Gave {member} {lvl1}") # can log this better
if member_id == 811235357663297546:
await update_google_sheet()
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: # could change to if author does not have bot role (roleid)
if "!help_xp" not in message.content:
print(f"adding exp from message {message.author}")
await asyncio.sleep(1)
await add_exp(message.author.id)
await bot.process_commands(message)
except Exception as e:
print(f"on_message Error: {e}")
""""""
demo = gr.Blocks()
with demo:
gr.HTML("a")
demo.queue().launch()
DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None)
def run_bot():
bot.run(DISCORD_TOKEN)
threading.Thread(target=run_bot).start()