Добавил турнирную таблицу
This commit is contained in:
163
src/CoreFun.py
163
src/CoreFun.py
@@ -28,6 +28,9 @@ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sess
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.schema import CreateTable
|
||||
|
||||
import gspread
|
||||
from google.oauth2.service_account import Credentials
|
||||
|
||||
class AnyBots(commands.Bot):
|
||||
'''
|
||||
|
||||
@@ -357,19 +360,23 @@ class AdminBot(AnyBots):
|
||||
|
||||
async def on_ready(self):
|
||||
await super().on_ready(inherited = True)
|
||||
self.UpdatingTournamentData.start() # Удалить обязательно!!!
|
||||
|
||||
if self.task_start:
|
||||
self.VoiceXpAdder.cancel()
|
||||
self.CheckDataBase.cancel()
|
||||
self.UpdatingTournamentData.cancel()
|
||||
|
||||
self.VoiceXpAdder.start()
|
||||
self.CheckDataBase.start()
|
||||
self.UpdatingTournamentData.start()
|
||||
|
||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekFunLoopsBot activated")
|
||||
|
||||
async def BotOff(self):
|
||||
self.VoiceXpAdder.cancel()
|
||||
self.CheckDataBase.cancel()
|
||||
self.UpdatingTournamentData.cancel()
|
||||
|
||||
self.stop_event.set()
|
||||
|
||||
@@ -508,20 +515,148 @@ class AdminBot(AnyBots):
|
||||
|
||||
await self.LevelRolesGiver(msg.author, self.CalculateLevel(period_messages, period_voice_activity))
|
||||
|
||||
'''if msg.channel.id == 1228525235024695328:
|
||||
embed = disnake.Embed(
|
||||
title='Новые работы',
|
||||
description="\n".join("## "+str(i) for i in msg.attachments)+"\n**"+str(msg.content)+"**\nАвтор: "+str(msg.author)+" "+str(msg.author.id),
|
||||
color=0x2F3136
|
||||
)
|
||||
if len(msg.attachments)>0:
|
||||
await msg.attachments[0].save("timelycontent.png")
|
||||
embed.set_image(file = disnake.File(fp="timelycontent.png"))
|
||||
mirror = self.get_channel(1228525202107793519)
|
||||
await mirror.send(embed=embed)
|
||||
await msg.reply(embed=disnake.Embed(description=f'Ваша работа отправлена на проверку и будет опубликована в течение суток', colour=0x2F3136))
|
||||
await msg.delete()
|
||||
os.remove("timelycontent.png")'''
|
||||
@tasks.loop(seconds=3600)
|
||||
async def UpdatingTournamentData(self):
|
||||
krekchat = await self.fetch_guild(self.krekchat.id)
|
||||
tournament_channel = await krekchat.fetch_channel(1396785366882582538)
|
||||
msg = await tournament_channel.fetch_message(1396787609891635200)
|
||||
|
||||
if not hasattr(self, 'tournament_table_client'):
|
||||
SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
|
||||
creds = Credentials.from_service_account_file("src/data/secrets/krekbottable-9a40985c56e2.json", scopes=SCOPES)
|
||||
self.tournament_table_client = gspread.authorize(creds)
|
||||
|
||||
async def shorten_url_tinyurl(url: str) -> str:
|
||||
if not hasattr(self, '_url_cache'):
|
||||
self._url_cache = {}
|
||||
|
||||
if url in self._url_cache:
|
||||
return self._url_cache[url]
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get("https://tinyurl.com/api-create.php", params={"url": url}) as resp:
|
||||
resp.raise_for_status()
|
||||
short_url = await resp.text()
|
||||
self._url_cache[url] = short_url
|
||||
return short_url
|
||||
|
||||
spreadsheet = self.tournament_table_client.open_by_key("16t28W1nlexAS-J26Mk18EgtPUX3344XdB18c5glA3Fg")
|
||||
sheet = spreadsheet.worksheet("Ответы на форму")
|
||||
data = sheet.get_all_values()
|
||||
|
||||
class RowData:
|
||||
def __init__(self, row):
|
||||
if isinstance(row, RowData):
|
||||
row = row.raw_data
|
||||
self.points = int(row[-2])
|
||||
self.discord_id = int(row[5]) if row[5] else None
|
||||
self.nick = row[7]
|
||||
self.links = row[8]
|
||||
self.verified = row[-4]
|
||||
self.cost = int(row[-5]) if row[-5] else 0
|
||||
self.raw_data = row
|
||||
|
||||
def __lt__(self, other):
|
||||
return (self.points, self.cost) < (other.points, other.cost)
|
||||
|
||||
def __le__(self, other):
|
||||
return (self.points, self.cost) <= (other.points, other.cost)
|
||||
|
||||
def __gt__(self, other):
|
||||
return (self.points, self.cost) > (other.points, other.cost)
|
||||
|
||||
def __ge__(self, other):
|
||||
return (self.points, self.cost) >= (other.points, other.cost)
|
||||
|
||||
async def to_str(self, num: int = None):
|
||||
try:
|
||||
member = await krekchat.fetch_member(int(row.discord_id))
|
||||
except:
|
||||
member = None
|
||||
|
||||
if num is not None:
|
||||
result = f"**{num}) "
|
||||
else:
|
||||
result = f"**-"
|
||||
|
||||
result += f"[{self.nick}]("
|
||||
result += f"https://docs.google.com/spreadsheets/d/1QkaNYezumeb-QJHSZ3x1vIi5ktf0ooDklYkrP6xSMZc/edit?gid=0&range=A{num+2}"
|
||||
result += ")"
|
||||
if member is None:
|
||||
result += "**\n"
|
||||
else:
|
||||
result += f" ({member.mention})**\n"
|
||||
|
||||
result += f"`{self.points} очков`\n"
|
||||
|
||||
saved_links = [("youtu.be", "YouTube"), ("youtube.com", "YouTube"), ("twitch.tv", "Twitch")]
|
||||
result += f"Стримы: "
|
||||
|
||||
links = []
|
||||
for link in self.links.split():
|
||||
for saved_link in saved_links:
|
||||
if saved_link[0] in link:
|
||||
links.append(f"[{saved_link[1]}]({await shorten_url_tinyurl(link)})")
|
||||
break
|
||||
else:
|
||||
links.append(f"{link}")
|
||||
|
||||
result += ", ".join(links) + "\n"
|
||||
result += f"Проверено модерацией: " + ("✅" if self.verified == "Прошло модерацию" else "❎")
|
||||
return result
|
||||
|
||||
class Stack:
|
||||
def __init__(self, name, data):
|
||||
self.name = name
|
||||
self.data_stack = []
|
||||
|
||||
for row in data:
|
||||
if isinstance(row, RowData):
|
||||
self.data_stack.append(RowData(row))
|
||||
else:
|
||||
self.data_stack.append(row)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.data_stack)
|
||||
|
||||
class Stacks:
|
||||
def __init__(self, stack_size, data):
|
||||
self.data_parts = []
|
||||
for i in range(1, (len(data)+(stack_size-1))//stack_size+1):
|
||||
self.data_parts.append(Stack(name = f"Топ {i*stack_size}" , data = data[stack_size*(i-1):stack_size*i]))
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.data_parts)
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.data_parts[key]
|
||||
|
||||
|
||||
data = [RowData(i) for i in data[2:]]
|
||||
|
||||
data = [i for i in sorted(data, reverse = True) if i.points > 0]
|
||||
fdata = Stacks(stack_size = 5, data = data)
|
||||
|
||||
color = 0x211125
|
||||
|
||||
embeds = []
|
||||
|
||||
embed = disnake.Embed(description = "[Оригинал таблицы](https://docs.google.com/spreadsheets/d/1QkaNYezumeb-QJHSZ3x1vIi5ktf0ooDklYkrP6xSMZc/edit?usp=sharing)\nᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ\n# Таблица лидеров", colour=color)
|
||||
embeds.append(embed)
|
||||
|
||||
row_num = 1
|
||||
for stack in fdata[:5]:
|
||||
embed = disnake.Embed(title = f"{stack.name}", description = "ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ", colour=color)
|
||||
|
||||
for row in stack:
|
||||
embed.add_field(name = "", value = f"{await row.to_str(num = row_num)}", inline = False)
|
||||
row_num += 1
|
||||
embeds.append(embed)
|
||||
|
||||
embed = disnake.Embed(description = "**Эта таблица обновляется каждый час и может содержать только топ-20 участников.\n\nБолее детальную и актуальную информацию можете найти в [оригинальной таблице](https://docs.google.com/spreadsheets/d/1QkaNYezumeb-QJHSZ3x1vIi5ktf0ooDklYkrP6xSMZc/edit?usp=sharing).**", colour=color)
|
||||
embeds.append(embed)
|
||||
|
||||
await msg.edit("", embeds = embeds)
|
||||
|
||||
@tasks.loop(seconds=60)
|
||||
async def VoiceXpAdder(self):
|
||||
|
||||
@@ -62,7 +62,7 @@ def render(data, design):
|
||||
# Текст
|
||||
try:
|
||||
font = ImageFont.truetype("src/data/fonts/segoeuib.ttf", 24*scale)
|
||||
if len(data['nick']) >= 12:
|
||||
if len(data['nick']) >= 11:
|
||||
font = ImageFont.truetype("src/data/fonts/segoeuib.ttf", 20*scale)
|
||||
if len(data['nick']) > 12:
|
||||
data['nick'].replace("_", " ")
|
||||
|
||||
20
src/test_google_sheets.py
Normal file
20
src/test_google_sheets.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import gspread
|
||||
from google.oauth2.service_account import Credentials
|
||||
|
||||
# Настройка авторизации
|
||||
SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
|
||||
creds = Credentials.from_service_account_file("src/data/secrets/krekbottable-9a40985c56e2.json", scopes=SCOPES)
|
||||
client = gspread.authorize(creds)
|
||||
|
||||
# Открываем таблицу по названию или ID
|
||||
spreadsheet = client.open_by_key("16t28W1nlexAS-J26Mk18EgtPUX3344XdB18c5glA3Fg")
|
||||
|
||||
# Выбираем лист
|
||||
sheet = spreadsheet.worksheet("Ответы на форму") # имя листа, например "Sheet1"
|
||||
|
||||
# Получаем все значения в виде списка списков
|
||||
data = sheet.get_all_values()
|
||||
|
||||
# Печатаем
|
||||
for row in data:
|
||||
print(row)
|
||||
Reference in New Issue
Block a user