Добавил проект с учетом .gitignore

This commit is contained in:
2025-07-06 19:24:54 +03:00
parent 41ad5a5b92
commit e796892942
20 changed files with 6162 additions and 3 deletions

124
src/cogs/designer.py Normal file
View File

@@ -0,0 +1,124 @@
import disnake
from disnake.ext import commands
from disnake.ext import tasks
import requests
import numpy as np
import asyncio
import sys
import os
import copy
import datetime
import math
import random
import json
import shutil
import imageio
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
import textwrap
from constants.global_constants import *
def setup(bot):
bot.add_cog(MainDesignerModule(bot))
class MainDesignerModule(commands.Cog):
def __init__(self, client):
self.client = client
self.DataBaseManager = client.DataBaseManager
@commands.Cog.listener()
async def on_ready(self):
self.krekchat = await self.client.fetch_guild(constants["krekchat"])
self.sponsors = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["sponsors"]]
self.me = disnake.utils.get(self.krekchat.roles, id=constants["me"])
print(f'KrekFunBot designer module activated')
@commands.slash_command(name = "профиль", description="Ваш профиль на сервере")
async def Profile(self, ctx: disnake.AppCmdInter,
member: disnake.Member = commands.Param(description="Чей профиль хотите посмотреть?", name="участник", default=None),
old_style: bool = commands.Param(description="Если у вас не грузятся картинки, это лучший вариант", name="старый_стиль", default=False)):
if not member:
member = ctx.author
await ctx.response.defer()
async with self.DataBaseManager.session() as session:
async with session.begin():
async with self.DataBaseManager.models['users'] as users_model:
user = await session.get(users_model, member.id)
if user is None:
await self.client.ErrorOutHelper(send_function = ctx.edit_original_message).out(n="Ошибка профиля", d=f"{'Вас' if member == ctx.author else 'Этого пользователя'} пока нет в базе данных{', напишите хотя бы одно сообщение' if member == ctx.author else ''}")
return
rating = users_model.period_messages + (users_model.period_voice_activity / 180.0)
subquery = (
self.DataBaseManager.select(
users_model.id,
self.DataBaseManager.func.row_number().over(order_by=[self.DataBaseManager.desc(rating)]).label('rank')
)
.subquery()
)
stmt = (
self.DataBaseManager.select(subquery.c.rank)
.where(subquery.c.id == member.id)
)
user_rank = (await session.execute(stmt)).scalar()
stmt = self.DataBaseManager.select(self.DataBaseManager.models['profile_design_inventory'].m).where(
self.DataBaseManager.models['profile_design_inventory'].m.user_id == member.id,
self.DataBaseManager.models['profile_design_inventory'].m.is_active == True
)
design = (await session.execute(stmt)).scalars().first()
if design is None:
design = await session.get(self.DataBaseManager.models['profile_design'].m, 1)
else:
design = design.design
if old_style:
embed = disnake.Embed(title=f"Профиль **{member.display_name}**", description=f'')
embed.colour = 0x2F3136
embed.set_thumbnail(url=member.avatar)
level = self.client.CalculateLevel(user.period_messages, user.period_voice_activity)
embed.add_field(name=f"Уровень",
value=f"`{int(level)}`\n|{'' * int((level % 1) * 35) + '' * (35 - int((level % 1) * 35))}|\n",
inline=False)
if ctx.guild is None:
embed.add_field(name=f"Баланс ", value=f"`{int(user.crumbs)} крошек`", inline=True)
else:
modify = max(0, (bool(await user.in_role(roles = self.sponsors, member = member))+1) + (user.carma / 100))
embed.add_field(name=f"Баланс " + ("" if modify == 1 else f"(x{float(modify):.02n})"), value=f"`{int(user.crumbs)} крошек`", inline=True)
embed.add_field(name=f"Текстовая активность", value=f"`{user.period_messages} сообщений`", inline=True)
embed.add_field(name=f"Голосовая активность", value=f"`{round(user.period_voice_activity / (60))} минут`", inline=True)
embed.add_field(name=f"Репутация", value=f"`{int(user.carma)}`", inline=True)
embed.add_field(name=f"Топ", value=f"`{user_rank}`", inline=True)
if user.staff_salary != 0:
embed.add_field(name=f"Зарплата", value=f"`{user.staff_salary:.02n} крошек в час`", inline=True)
await ctx.edit_original_message(embed=embed)
else:
data = {}
if design.render_profile_code is None:
await self.client.ErrorOutHelper(send_function = ctx.edit_original_message).out(n="Ошибка профиля", d=f"Для этой темы профиля не определена функция render. Свяжитесь с разработчиком для решения этой проблемы")
return
avatar_asset = member.avatar or member.default_avatar
avatar_bytes = await avatar_asset.read()
avatar_buffer = BytesIO(avatar_bytes)
avatar_image = Image.open(avatar_buffer).convert("RGBA")
data['avatar'] = avatar_image
data['user'] = user
data['place_in_top'] = user_rank
data['crumbs_modify'] = max(0, (bool(await user.in_role(roles = self.sponsors, member = member))+1) + (user.carma / 100)) if ctx.guild is not None else 1
data['nick'] = member.display_name
data['level'] = self.client.CalculateLevel(user.period_messages, user.period_voice_activity)
namespace = globals().copy()
if design.type == "PNG":
await ctx.edit_original_message(file=disnake.File(fp=design.render_profile(data, namespace), filename="profile.png"))
elif design.type == "GIF":
await ctx.edit_original_message(file=disnake.File(fp=design.render_profile(data, namespace), filename="profile.gif"))