Compare commits
23 Commits
main
...
tournament
| Author | SHA1 | Date | |
|---|---|---|---|
| f3475f8b27 | |||
| 39fa59e009 | |||
| 2c93ded028 | |||
| 42c37b3c7b | |||
| 52ab8ff8b5 | |||
| a83483b7c5 | |||
| c0782c9034 | |||
| defbcddc7c | |||
| 569e81c2f3 | |||
| 6dc7b24781 | |||
| b90701835c | |||
| 182cc13a1a | |||
| 72c4fcc349 | |||
| 535ebfff16 | |||
| 8d3fea2908 | |||
| cc69341a0b | |||
| 68196bf9a5 | |||
| b79ffcf7d1 | |||
| fde4b9e721 | |||
| b69a5bfc45 | |||
| dc8f0b7d4e | |||
| c78fb9925d | |||
| f1605d975e |
57
.dockerignore
Normal file
57
.dockerignore
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Python
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.so
|
||||||
|
.Python
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
pythonenv/
|
||||||
|
|
||||||
|
# Package files
|
||||||
|
*.egg
|
||||||
|
*.egg-info/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
eggs/
|
||||||
|
parts/
|
||||||
|
var/
|
||||||
|
sdist/
|
||||||
|
develop-eggs/
|
||||||
|
.installed.cfg
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Logs and databases
|
||||||
|
*.log
|
||||||
|
*.sqlite3
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.production
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# Temp files
|
||||||
|
tmp/
|
||||||
|
temp/
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,13 +1,12 @@
|
|||||||
venv/
|
venv/
|
||||||
nb_venv/
|
|
||||||
pc_venv/
|
|
||||||
|
|
||||||
docs/
|
docs/
|
||||||
|
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
|
||||||
|
*.db
|
||||||
|
*.sql
|
||||||
|
|
||||||
.env
|
.env
|
||||||
.secrets
|
secrets/
|
||||||
src/data/secrets/
|
|
||||||
src/backups/
|
|
||||||
9
Dockerfile
Normal file
9
Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM python:3
|
||||||
|
|
||||||
|
WORKDIR /usr/src/economy-bot
|
||||||
|
RUN apt update && apt install -y postgresql-client
|
||||||
|
COPY requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
CMD [ "python", "src/CoreFun.py" ]
|
||||||
15
docker-compose.yml
Normal file
15
docker-compose.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
services:
|
||||||
|
discord-economy-bot:
|
||||||
|
build: .
|
||||||
|
image: discord-economy-bot
|
||||||
|
container_name: discord-economy-bot
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- postgres-network
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
networks:
|
||||||
|
postgres-network:
|
||||||
|
external: true
|
||||||
@@ -6,6 +6,4 @@ __pycache__/
|
|||||||
*.pyc
|
*.pyc
|
||||||
.git/
|
.git/
|
||||||
.env
|
.env
|
||||||
.secrets
|
|
||||||
secrets/
|
|
||||||
backups/
|
backups/
|
||||||
|
|||||||
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
423
src/CoreFun.py
423
src/CoreFun.py
@@ -1,3 +1,7 @@
|
|||||||
|
import logging
|
||||||
|
logging.basicConfig(level=logging.INFO, force=True, format="%(asctime)s %(name)s %(levelname)s: %(message)s", datefmt="%d-%m-%Y %H:%M:%S")
|
||||||
|
|
||||||
|
import typing
|
||||||
import disnake
|
import disnake
|
||||||
from disnake.ext import commands
|
from disnake.ext import commands
|
||||||
from disnake.ext import tasks
|
from disnake.ext import tasks
|
||||||
@@ -18,7 +22,7 @@ import re
|
|||||||
|
|
||||||
from constants.rimagochi_constants import *
|
from constants.rimagochi_constants import *
|
||||||
from constants.global_constants import *
|
from constants.global_constants import *
|
||||||
from data.secrets.TOKENS import TOKENS
|
from libs.tokens_formatter import TOKENS
|
||||||
from database.db_classes import all_data as DataBaseClasses
|
from database.db_classes import all_data as DataBaseClasses
|
||||||
from managers.DataBaseManager import DatabaseManager
|
from managers.DataBaseManager import DatabaseManager
|
||||||
from database.settings import config
|
from database.settings import config
|
||||||
@@ -28,7 +32,13 @@ from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sess
|
|||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
from sqlalchemy.schema import CreateTable
|
from sqlalchemy.schema import CreateTable
|
||||||
|
|
||||||
|
import gspread
|
||||||
|
from google.oauth2.service_account import Credentials
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class AnyBots(commands.Bot):
|
class AnyBots(commands.Bot):
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +59,7 @@ class AnyBots(commands.Bot):
|
|||||||
|
|
||||||
async def on_ready(self, inherited = False):
|
async def on_ready(self, inherited = False):
|
||||||
self.krekchat = await self.fetch_guild(constants["krekchat"])
|
self.krekchat = await self.fetch_guild(constants["krekchat"])
|
||||||
print(self.krekchat.name)
|
self.logger.info(self.krekchat.name)
|
||||||
self.sponsors = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["sponsors"]]
|
self.sponsors = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["sponsors"]]
|
||||||
self.mutes = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["mutes"]]
|
self.mutes = [disnake.utils.get(self.krekchat.roles, id=i) for i in constants["mutes"]]
|
||||||
self.ban_role = disnake.utils.get(self.krekchat.roles, id=constants["ban_role"])
|
self.ban_role = disnake.utils.get(self.krekchat.roles, id=constants["ban_role"])
|
||||||
@@ -67,7 +77,7 @@ class AnyBots(commands.Bot):
|
|||||||
await self.change_presence(status=disnake.Status.online, activity=disnake.Game("Работаю"))
|
await self.change_presence(status=disnake.Status.online, activity=disnake.Game("Работаю"))
|
||||||
|
|
||||||
if not inherited:
|
if not inherited:
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekFunBot activated")
|
self.logger.info(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekFunBot activated")
|
||||||
|
|
||||||
async def RimagochiUserUpdate(self, member, session = None):
|
async def RimagochiUserUpdate(self, member, session = None):
|
||||||
if session is None:
|
if session is None:
|
||||||
@@ -301,46 +311,35 @@ class AnyBots(commands.Bot):
|
|||||||
matches = re.findall(pattern, time_str)
|
matches = re.findall(pattern, time_str)
|
||||||
|
|
||||||
for value, _, unit in matches:
|
for value, _, unit in matches:
|
||||||
time_units[unit] += float(value)
|
time_units[unit] += value
|
||||||
|
|
||||||
return FormatedTime(time_units)
|
return FormatedTime(time_units)
|
||||||
|
|
||||||
class ErrorOutHelper:
|
class ErrEmbed(disnake.Embed):
|
||||||
def __init__(self, send_function, err_name: str = "", err_description: str = "", ephemeral: bool = False, echo: bool = False, thumbnail = None):
|
def __init__(self, err_func: typing.Callable[..., typing.Awaitable[None]] | None = None, err_func_kwargs: dict | None = None, **kwargs):
|
||||||
self.err_name = err_name
|
color = kwargs.pop('color', 0x2F3136)
|
||||||
self.err_description = err_description
|
super().__init__(color=color, **kwargs)
|
||||||
self.send_function = send_function
|
self.err_func_kwargs: dict = err_func_kwargs or {}
|
||||||
self.ephemeral = ephemeral
|
self.err_func = err_func
|
||||||
self.echo = echo
|
|
||||||
self.thumbnail = thumbnail
|
|
||||||
self.colour = 0xff0000
|
|
||||||
|
|
||||||
async def out(self, err_description: str = "", err_name: str = "", d: str = "", n: str = ""):
|
async def send(self, description: str | None = None):
|
||||||
if d:
|
if self.err_func is None:
|
||||||
err_description = d
|
raise ValueError("err_func не задана")
|
||||||
if n:
|
|
||||||
err_name = n
|
if description is not None:
|
||||||
|
self.description = description
|
||||||
|
|
||||||
embed = disnake.Embed(title="", description="", colour = self.colour)
|
await self.err_func(embed = self, **self.err_func_kwargs)
|
||||||
if err_name:
|
|
||||||
embed.title = err_name
|
|
||||||
else:
|
|
||||||
embed.title = self.err_name
|
|
||||||
|
|
||||||
if err_description:
|
class InfoEmbed(disnake.Embed):
|
||||||
embed.description = err_description
|
def __init__(self, **kwargs):
|
||||||
else:
|
color = kwargs.pop('color', 0x2F3136)
|
||||||
embed.description = self.err_description
|
super().__init__(color = color, **kwargs)
|
||||||
|
|
||||||
if not self.thumbnail is None:
|
class WarnEmbed(disnake.Embed):
|
||||||
embed.set_thumbnail(url = self.thumbnail)
|
def __init__(self, **kwargs):
|
||||||
|
color = kwargs.pop('color', 0xFFFF00)
|
||||||
if self.echo:
|
super().__init__(color = color, **kwargs)
|
||||||
print(f"{embed.title}: {embed.description}")
|
|
||||||
if 'ephemeral' in inspect.signature(self.send_function).parameters:
|
|
||||||
await self.send_function(embed = embed, ephemeral = self.ephemeral)
|
|
||||||
else:
|
|
||||||
await self.send_function(embed = embed)
|
|
||||||
|
|
||||||
class AdminBot(AnyBots):
|
class AdminBot(AnyBots):
|
||||||
'''
|
'''
|
||||||
@@ -355,21 +354,26 @@ class AdminBot(AnyBots):
|
|||||||
self.task_start = task_start
|
self.task_start = task_start
|
||||||
self.stop_event = stop_event
|
self.stop_event = stop_event
|
||||||
|
|
||||||
async def on_ready(self):
|
async def on_ready(self, inherited = True):
|
||||||
await super().on_ready(inherited = True)
|
await super().on_ready(inherited = True)
|
||||||
|
|
||||||
if self.task_start:
|
if self.task_start:
|
||||||
self.VoiceXpAdder.cancel()
|
self.VoiceXpAdder.cancel()
|
||||||
self.CheckDataBase.cancel()
|
self.CheckDataBase.cancel()
|
||||||
|
self.UpdatingTournamentData.cancel()
|
||||||
|
|
||||||
self.VoiceXpAdder.start()
|
self.VoiceXpAdder.start()
|
||||||
self.CheckDataBase.start()
|
self.CheckDataBase.start()
|
||||||
|
self.UpdatingTournamentData.start()
|
||||||
|
else:
|
||||||
|
self.UpdatingTournamentData.start() # Удалить обязательно!!!
|
||||||
|
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekFunLoopsBot activated")
|
self.logger.info(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: KrekFunLoopsBot activated")
|
||||||
|
|
||||||
async def BotOff(self):
|
async def BotOff(self):
|
||||||
self.VoiceXpAdder.cancel()
|
self.VoiceXpAdder.cancel()
|
||||||
self.CheckDataBase.cancel()
|
self.CheckDataBase.cancel()
|
||||||
|
self.UpdatingTournamentData.cancel()
|
||||||
|
|
||||||
self.stop_event.set()
|
self.stop_event.set()
|
||||||
|
|
||||||
@@ -377,13 +381,13 @@ class AdminBot(AnyBots):
|
|||||||
if self.stop_event.is_set():
|
if self.stop_event.is_set():
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Соединение с дискордом разорвано")
|
self.logger.error(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Соединение с дискордом разорвано")
|
||||||
await self.BotOff()
|
await self.BotOff()
|
||||||
|
|
||||||
async def check_bt_channel(self):
|
async def check_bt_channel(self):
|
||||||
async def moder_dataparser(data: dict):
|
async def moder_dataparser(data: dict):
|
||||||
if not 'type' in data.keys():
|
if not 'type' in data.keys():
|
||||||
raise json.JSONDecodeError()
|
raise json.JSONDecodeError("Некорректный JSON", '{"type":value}', 0)
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
async with self.DataBaseManager.models['users'] as users_model:
|
async with self.DataBaseManager.models['users'] as users_model:
|
||||||
@@ -436,6 +440,8 @@ class AdminBot(AnyBots):
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
stopflag = False
|
stopflag = False
|
||||||
|
if not isinstance(bt_channel, disnake.TextChannel):
|
||||||
|
raise ValueError("В bt_channel как-то оказалось не disnake.TextChannel")
|
||||||
batch = await bt_channel.history(limit=10, before=last_msg).flatten()
|
batch = await bt_channel.history(limit=10, before=last_msg).flatten()
|
||||||
for message in batch:
|
for message in batch:
|
||||||
msg_stopflag = False
|
msg_stopflag = False
|
||||||
@@ -444,20 +450,20 @@ class AdminBot(AnyBots):
|
|||||||
msg_stopflag = True
|
msg_stopflag = True
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
data = json.loads(message.content)
|
||||||
try:
|
try:
|
||||||
data = json.loads(message.content)
|
|
||||||
result = 0
|
result = 0
|
||||||
if not 'sender' in data:
|
if not 'sender' in data:
|
||||||
raise json.JSONDecodeError()
|
raise json.JSONDecodeError("Некорректный JSON", '{"sender":value}', 0)
|
||||||
if data['sender'] == "ModBot":
|
if data['sender'] == "ModBot":
|
||||||
result = await moder_dataparser(data)
|
result = await moder_dataparser(data)
|
||||||
if result:
|
if result:
|
||||||
raise json.JSONDecodeError()
|
raise json.JSONDecodeError("Некорерктный JSON", '', 0)
|
||||||
await message.add_reaction("✅")
|
await message.add_reaction("✅")
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
await message.add_reaction("❎")
|
await message.add_reaction("❎")
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
print(data, exc)
|
self.logger.error(f"{data} {exc}")
|
||||||
if msg_stopflag:
|
if msg_stopflag:
|
||||||
stopflag = True
|
stopflag = True
|
||||||
break
|
break
|
||||||
@@ -470,18 +476,18 @@ class AdminBot(AnyBots):
|
|||||||
add_crumbs = (incoming_crumbs * modifier) if incoming_crumbs * modifier >= 0 else 0
|
add_crumbs = (incoming_crumbs * modifier) if incoming_crumbs * modifier >= 0 else 0
|
||||||
return add_crumbs
|
return add_crumbs
|
||||||
|
|
||||||
async def on_message(self, msg):
|
async def on_message(self, message):
|
||||||
if msg.author.id == 479210801891115009 and msg.content == "botsoff":
|
if message.author.id == 479210801891115009 and message.content == "botsoff":
|
||||||
await msg.reply(embed=disnake.Embed(description=f'Бот отключён', colour=0xff9900))
|
await message.reply(embed=disnake.Embed(description=f'Бот отключён', colour=0xff9900))
|
||||||
await self.BotOff()
|
await self.BotOff()
|
||||||
if msg.guild is None:
|
if message.guild is None:
|
||||||
return
|
return
|
||||||
if msg.channel.id == self.bots_talk_protocol_channel_id:
|
if message.channel.id == self.bots_talk_protocol_channel_id:
|
||||||
await self.check_bt_channel()
|
await self.check_bt_channel()
|
||||||
if msg.author.bot:
|
if message.author.bot:
|
||||||
return
|
return
|
||||||
crumb_per_word = 1 / 2
|
crumb_per_word = 1 / 2
|
||||||
text = msg.content
|
text = message.content
|
||||||
while " " in text:
|
while " " in text:
|
||||||
text = text.replace(" ", " ")
|
text = text.replace(" ", " ")
|
||||||
add_crumbs = len(text.split(" ")) * crumb_per_word
|
add_crumbs = len(text.split(" ")) * crumb_per_word
|
||||||
@@ -489,39 +495,172 @@ class AdminBot(AnyBots):
|
|||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
async with self.DataBaseManager.models['users'] as users_model:
|
async with self.DataBaseManager.models['users'] as users_model:
|
||||||
stmt = self.DataBaseManager.select(users_model).where(users_model.id == msg.author.id)
|
stmt = self.DataBaseManager.select(users_model).where(users_model.id == message.author.id)
|
||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
user = users_model(id = msg.author.id, period_messages = 1, summary_messages = 1, crumbs = (await self.give_crumbs_counter(incoming_crumbs = add_crumbs, sponsor_roles = self.sponsors, member = msg.author)))
|
user = users_model(id = message.author.id, period_messages = 1, summary_messages = 1, crumbs = (await self.give_crumbs_counter(incoming_crumbs = add_crumbs, sponsor_roles = self.sponsors, member = message.author)))
|
||||||
session.add(user)
|
session.add(user)
|
||||||
period_messages, period_voice_activity = 1, 0
|
period_messages, period_voice_activity = 1, 0
|
||||||
|
|
||||||
else:
|
else:
|
||||||
stmt = self.DataBaseManager.update(users_model).where(users_model.id == msg.author.id).values(
|
stmt = self.DataBaseManager.update(users_model).where(users_model.id == message.author.id).values(
|
||||||
period_messages = users_model.period_messages + 1,
|
period_messages = users_model.period_messages + 1,
|
||||||
summary_messages = users_model.summary_messages + 1,
|
summary_messages = users_model.summary_messages + 1,
|
||||||
crumbs = users_model.crumbs + (await self.give_crumbs_counter(incoming_crumbs = add_crumbs, sponsor_roles = self.sponsors, member = msg.author, carma = user.carma))
|
crumbs = users_model.crumbs + (await self.give_crumbs_counter(incoming_crumbs = add_crumbs, sponsor_roles = self.sponsors, member = message.author, carma = user.carma))
|
||||||
)
|
)
|
||||||
await session.execute(stmt)
|
await session.execute(stmt)
|
||||||
period_messages, period_voice_activity = user.period_messages + 1, user.period_voice_activity
|
period_messages, period_voice_activity = user.period_messages + 1, user.period_voice_activity
|
||||||
|
|
||||||
await self.LevelRolesGiver(msg.author, self.CalculateLevel(period_messages, period_voice_activity))
|
await self.LevelRolesGiver(message.author, self.CalculateLevel(period_messages, period_voice_activity))
|
||||||
|
|
||||||
'''if msg.channel.id == 1228525235024695328:
|
_url_cache = {}
|
||||||
embed = disnake.Embed(
|
@tasks.loop(seconds=3600)
|
||||||
title='Новые работы',
|
async def UpdatingTournamentData(self):
|
||||||
description="\n".join("## "+str(i) for i in msg.attachments)+"\n**"+str(msg.content)+"**\nАвтор: "+str(msg.author)+" "+str(msg.author.id),
|
krekchat = await self.fetch_guild(self.krekchat.id)
|
||||||
color=0x2F3136
|
tournament_channel = await krekchat.fetch_channel(1396785366882582538)
|
||||||
)
|
if not isinstance(tournament_channel, disnake.TextChannel):
|
||||||
if len(msg.attachments)>0:
|
raise
|
||||||
await msg.attachments[0].save("timelycontent.png")
|
webhooks = await tournament_channel.webhooks()
|
||||||
embed.set_image(file = disnake.File(fp="timelycontent.png"))
|
webhook = webhooks[0]
|
||||||
mirror = self.get_channel(1228525202107793519)
|
|
||||||
await mirror.send(embed=embed)
|
if not hasattr(self, 'tournament_table_client'):
|
||||||
await msg.reply(embed=disnake.Embed(description=f'Ваша работа отправлена на проверку и будет опубликована в течение суток', colour=0x2F3136))
|
SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
|
||||||
await msg.delete()
|
creds = Credentials.from_service_account_file("secrets/krekbottable-9a40985c56e2.json", scopes=SCOPES)
|
||||||
os.remove("timelycontent.png")'''
|
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 = 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"**-"
|
||||||
|
num = -2
|
||||||
|
|
||||||
|
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 webhook.edit_message(1405594708016889909, content = "", embeds = embeds)
|
||||||
|
|
||||||
@tasks.loop(seconds=60)
|
@tasks.loop(seconds=60)
|
||||||
async def VoiceXpAdder(self):
|
async def VoiceXpAdder(self):
|
||||||
@@ -529,9 +668,12 @@ class AdminBot(AnyBots):
|
|||||||
channels = await self.krekchat.fetch_channels()
|
channels = await self.krekchat.fetch_channels()
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
for channel in channels:
|
for channel in channels:
|
||||||
|
|
||||||
|
channel = self.get_channel(channel.id)
|
||||||
|
|
||||||
if (not isinstance(channel, disnake.VoiceChannel)) or channel.id == 1250314784914669598:
|
if (not isinstance(channel, disnake.VoiceChannel)) or channel.id == 1250314784914669598:
|
||||||
continue
|
continue
|
||||||
channel = self.get_channel(channel.id)
|
|
||||||
for member in channel.members:
|
for member in channel.members:
|
||||||
if member.bot:
|
if member.bot:
|
||||||
continue
|
continue
|
||||||
@@ -562,7 +704,7 @@ class AdminBot(AnyBots):
|
|||||||
await self.LevelRolesGiver(member, self.CalculateLevel(period_messages, period_voice_activity))
|
await self.LevelRolesGiver(member, self.CalculateLevel(period_messages, period_voice_activity))
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: err VoiceXpAdder: {e}")
|
self.logger.exception(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: err VoiceXpAdder: {e}")
|
||||||
|
|
||||||
@tasks.loop(seconds=3600)
|
@tasks.loop(seconds=3600)
|
||||||
async def CheckDataBase(self):
|
async def CheckDataBase(self):
|
||||||
@@ -600,155 +742,48 @@ class AdminBot(AnyBots):
|
|||||||
backup_file = await self.DataBaseManager.pg_dump()
|
backup_file = await self.DataBaseManager.pg_dump()
|
||||||
krekchat = await self.fetch_guild(self.krekchat.id)
|
krekchat = await self.fetch_guild(self.krekchat.id)
|
||||||
backups_channel = await krekchat.fetch_channel(self.databases_backups_channel_id)
|
backups_channel = await krekchat.fetch_channel(self.databases_backups_channel_id)
|
||||||
|
if not isinstance(backups_channel, disnake.TextChannel):
|
||||||
|
raise ValueError("backups_channel is not disnake.TextChannel")
|
||||||
|
|
||||||
if "Backup failed" in backup_file:
|
if "Backup failed" in backup_file:
|
||||||
await backups_channel.send(content=backup_file)
|
await backups_channel.send(content=backup_file)
|
||||||
else:
|
else:
|
||||||
await backups_channel.send(content=f"Бэкап бд за {datetime.datetime.now()}:", file=disnake.File(backup_file))
|
await backups_channel.send(content=f"Бэкап бд за {datetime.datetime.now()}:", file=disnake.File(backup_file))
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"err CheckDataBase: {e}")
|
self.logger.exception(f"err CheckDataBase: {e}")
|
||||||
|
|
||||||
async def init_db():
|
async def init_db(debug = False):
|
||||||
DataBaseEngine = create_async_engine(
|
DataBaseEngine = create_async_engine(
|
||||||
config.Settings().DB_URL,
|
config.Settings().DB_URL,
|
||||||
pool_size=20,
|
pool_size=20,
|
||||||
max_overflow=10,
|
max_overflow=10,
|
||||||
pool_recycle=300,
|
pool_recycle=300,
|
||||||
pool_pre_ping=True,
|
pool_pre_ping=True,
|
||||||
#echo=True,
|
echo=debug,
|
||||||
)
|
)
|
||||||
async with DataBaseEngine.begin() as conn:
|
async with DataBaseEngine.begin() as conn:
|
||||||
await conn.run_sync(DataBaseClasses['base'].metadata.create_all)
|
await conn.run_sync(DataBaseClasses['base'].metadata.create_all)
|
||||||
|
|
||||||
return DatabaseManager(DataBaseEngine, DataBaseClasses)
|
return DatabaseManager(DataBaseEngine, DataBaseClasses)
|
||||||
|
|
||||||
# async def db_migration(DB_MANAGER):
|
|
||||||
# new_DataBase = DB_MANAGER
|
|
||||||
# DataBase = await old_DatabaseManager.connect("data/fun.db")
|
|
||||||
# await DataBase.execute("PRAGMA journal_mode=WAL")
|
|
||||||
# await DataBase.execute("PRAGMA synchronous=NORMAL")
|
|
||||||
# try:
|
|
||||||
# async with new_DataBase.engine.begin() as conn:
|
|
||||||
# await conn.run_sync(new_DataBase.metadata.drop_all)
|
|
||||||
# await conn.run_sync(new_DataBase.metadata.create_all)
|
|
||||||
# async with new_DataBase.session() as session:
|
|
||||||
# users = [DB_MANAGER.model_classes['users'](
|
|
||||||
# id = userid, crumbs = crumbs, summary_messages = messages, summary_voice_activity = voiceactivity,
|
|
||||||
# carma = carma, staff_salary = staffsalary, last_daily_crumbs_date = lastdailycrumbsdate
|
|
||||||
# )
|
|
||||||
# for userid, crumbs, messages, voiceactivity, carma, rolesinventory, staffsalary, sellingroles, ownchannels, timedroles, lastdailycrumbsdate\
|
|
||||||
# in await DataBase.SelectBD('users')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(users)
|
|
||||||
|
|
||||||
# roles_custom = [DB_MANAGER.model_classes['roles_custom'](
|
|
||||||
# id = roleid, creator_id = creatorid, cost = cost, renewal_date = renewaldate, renewal_enabled = renewal, date_of_creation = dateofcreation
|
|
||||||
# )
|
|
||||||
# for roleid, creatorid, dateofcreation, cost, sales, renewaldate, renewal in await DataBase.SelectBD('selling_roles')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(roles_custom)
|
|
||||||
|
|
||||||
# received_roles_custom = [DB_MANAGER.model_classes['received_roles_custom'](
|
|
||||||
# role_id = roleid, user_id = int(user)
|
|
||||||
# )
|
|
||||||
# for roleid, creatorid, dateofcreation, cost, sales, renewaldate, renewal in await DataBase.SelectBD('selling_roles')
|
|
||||||
# for user in sales.split(":")
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(received_roles_custom)
|
|
||||||
|
|
||||||
# roles_prize = [DB_MANAGER.model_classes['roles_prize'](
|
|
||||||
# id = roleid
|
|
||||||
# )
|
|
||||||
# for roleid, surrendered in await DataBase.SelectBD('prize_roles')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(roles_prize)
|
|
||||||
|
|
||||||
# received_roles_prize = [DB_MANAGER.model_classes['received_roles_prize'](
|
|
||||||
# role_id = roleid, user_id = int(user)
|
|
||||||
# )
|
|
||||||
# for roleid, surrendered in await DataBase.SelectBD('prize_roles')
|
|
||||||
# for user in surrendered.split(":")
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(received_roles_prize)
|
|
||||||
|
|
||||||
# roles_static = [DB_MANAGER.model_classes['roles_static'](
|
|
||||||
# id = roleid,
|
|
||||||
# description = description
|
|
||||||
# )
|
|
||||||
# for roleid, description in await DataBase.SelectBD('uncustom_roles')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(roles_static)
|
|
||||||
|
|
||||||
# transaction_history_crumbs = [DB_MANAGER.model_classes['transaction_history_crumbs'](
|
|
||||||
# sender_id = sender if sender != 0 else None,
|
|
||||||
# recipient_id = recipient if recipient != 0 else None,
|
|
||||||
# amount = amount, commission_fraction = commission,
|
|
||||||
# description = comment, transaction_time = transactiontime
|
|
||||||
# )
|
|
||||||
# for sender, recipient, amount, commission, comment, transactiontime in await DataBase.SelectBD('history')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(transaction_history_crumbs)
|
|
||||||
|
|
||||||
# casino_user_account = [DB_MANAGER.model_classes['casino_user_account'](
|
|
||||||
# id = int(userid), spins_today_count = spinstoday, last_reset_time = lastreset
|
|
||||||
# )
|
|
||||||
# for userid, spinstoday, lastreset in await DataBase.SelectBD('casino_limits')
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(casino_user_account)
|
|
||||||
|
|
||||||
# rimagochi_users = [DB_MANAGER.model_classes['rimagochi_users'](
|
|
||||||
# id = userid, items = json.loads(items), genes = json.loads(genes), wins = wins, settings = json.loads(settings)
|
|
||||||
# )
|
|
||||||
# for userid, animals, items, genes, battleslots, wins, settings in await DataBase.SelectBD('rimagochi_users')
|
|
||||||
# if userid != 920423544691761213 and userid != 1354557962168959077
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(rimagochi_users)
|
|
||||||
|
|
||||||
# rimagochi_animals = []
|
|
||||||
# for userid, animals, items, genes, battleslots, wins, settings in await DataBase.SelectBD('rimagochi_users'):
|
|
||||||
# rimagochi_animals += [DB_MANAGER.model_classes['rimagochi_animals'](
|
|
||||||
# id = int(item['id'][:4]), model_animal_id = item['animal_id'], genes = item['genes'], items = item['used_items'],
|
|
||||||
# last_feeding_time = item['last_feeding'], first_today_feed_time = item['first_feed_today_time'],
|
|
||||||
# feed_today_count = item['feed_today'], experience = item['exp'], level = item['level'], wins = item['wins'],
|
|
||||||
# initial_owner_id = int(item['id'].split("_")[1]), owner_id = userid, in_battle_slots = item['id'] in json.loads(battleslots).keys()
|
|
||||||
# )
|
|
||||||
# for key, item in json.loads(animals).items()
|
|
||||||
# ]
|
|
||||||
# async with session.begin():
|
|
||||||
# session.add_all(rimagochi_animals)
|
|
||||||
|
|
||||||
# finally:
|
|
||||||
# await DataBase.close()
|
|
||||||
|
|
||||||
# raise Exception("Миграция БД завершена. требуется переименовывание файлов")
|
|
||||||
|
|
||||||
|
|
||||||
async def run_bot(bot, token, stop_event):
|
async def run_bot(bot, token, stop_event):
|
||||||
try:
|
try:
|
||||||
await bot.start(token)
|
await bot.start(token)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Бот {bot.user.name if hasattr(bot, 'user') else 'Unknown'} упал с ошибкой: {e}")
|
logger.info(f"Бот {bot.user.name if hasattr(bot, 'user') else 'Unknown'} упал с ошибкой: {e}")
|
||||||
stop_event.set() # Сигнализируем об остановке
|
stop_event.set() # Сигнализируем об остановке
|
||||||
|
|
||||||
async def monitor_stop(stop_event, bots):
|
async def monitor_stop(stop_event, bots):
|
||||||
await stop_event.wait()
|
await stop_event.wait()
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Получен сигнал остановки, завершаю всех ботов...")
|
logger.info(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Получен сигнал остановки, завершаю всех ботов...")
|
||||||
|
|
||||||
for bot in bots:
|
for bot in bots:
|
||||||
if not bot.is_closed():
|
if not bot.is_closed():
|
||||||
try:
|
try:
|
||||||
await bot.close()
|
await bot.close()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при закрытии бота: {e}")
|
logger.error(f"Ошибка при закрытии бота: {e}")
|
||||||
|
|
||||||
await asyncio.sleep(0.1)
|
await asyncio.sleep(0.1)
|
||||||
|
|
||||||
@@ -757,8 +792,8 @@ async def main():
|
|||||||
DataBase = None
|
DataBase = None
|
||||||
all_bots = []
|
all_bots = []
|
||||||
admin_bot = None
|
admin_bot = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
DataBase = await init_db()
|
DataBase = await init_db()
|
||||||
|
|
||||||
# Инициализация ботов
|
# Инициализация ботов
|
||||||
@@ -785,17 +820,19 @@ async def main():
|
|||||||
await asyncio.gather(*bot_tasks, monitor_task)
|
await asyncio.gather(*bot_tasks, monitor_task)
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print("Боты остановлены по запросу пользователя")
|
logger.info("Боты остановлены по запросу пользователя")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Произошла критическая ошибка: {e}")
|
logger.exception(f"Произошла критическая ошибка")
|
||||||
finally:
|
finally:
|
||||||
await admin_bot.BotOff()
|
if admin_bot is not None:
|
||||||
|
await admin_bot.BotOff()
|
||||||
|
|
||||||
for bot in all_bots:
|
for bot in all_bots:
|
||||||
if not bot.is_closed():
|
if not bot.is_closed():
|
||||||
await bot.close()
|
await bot.close()
|
||||||
|
|
||||||
await DataBase.close()
|
if DataBase is not None:
|
||||||
|
await DataBase.close()
|
||||||
|
|
||||||
current_task = asyncio.current_task()
|
current_task = asyncio.current_task()
|
||||||
pending = [t for t in asyncio.all_tasks() if t is not current_task and not t.done()]
|
pending = [t for t in asyncio.all_tasks() if t is not current_task and not t.done()]
|
||||||
|
|||||||
0
src/backups/backups_where
Normal file
0
src/backups/backups_where
Normal file
@@ -30,18 +30,22 @@ class MainAdminModule(commands.Cog):
|
|||||||
|
|
||||||
@commands.Cog.listener()
|
@commands.Cog.listener()
|
||||||
async def on_ready(self):
|
async def on_ready(self):
|
||||||
print(f'KrekFunBot admin module activated')
|
self.client.logger.info(f'KrekFunBot admin module activated')
|
||||||
self.krekchat = await self.client.fetch_guild(constants["krekchat"])
|
self.krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
self.me = disnake.utils.get(self.krekchat.roles, id=constants["me"])
|
self.me = disnake.utils.get(self.krekchat.roles, id=constants["me"])
|
||||||
|
|
||||||
|
|
||||||
@commands.slash_command(name="bot_fun_off")
|
@commands.slash_command(name="bot_fun_off")
|
||||||
async def BotFunOff(self, ctx: disnake.ApplicationCommandInteraction):
|
async def BotFunOff(self, ctx: disnake.ApplicationCommandInteraction):
|
||||||
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо в личных сообщениях'), ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if self.me in ctx.author.roles:
|
if self.me in ctx.author.roles:
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Бот отключён', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.InfoEmbed(description=f'Бот отключён'), ephemeral=True)
|
||||||
await self.client.BotOff()
|
await self.client.BotOff()
|
||||||
else:
|
else:
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Не допустимо', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо'), ephemeral=True)
|
||||||
|
|
||||||
|
|
||||||
@commands.slash_command(name="зарегистрировать_призовую_роль")
|
@commands.slash_command(name="зарегистрировать_призовую_роль")
|
||||||
@@ -49,7 +53,7 @@ class MainAdminModule(commands.Cog):
|
|||||||
await ctx.response.defer(ephemeral=True)
|
await ctx.response.defer(ephemeral=True)
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(
|
await ctx.edit_original_message(
|
||||||
embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -60,9 +64,9 @@ class MainAdminModule(commands.Cog):
|
|||||||
if role_prize is None:
|
if role_prize is None:
|
||||||
prize_role = roles_prize_model(id = role.id)
|
prize_role = roles_prize_model(id = role.id)
|
||||||
session.add(prize_role)
|
session.add(prize_role)
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Теперь роль {role.mention} зарегистрирована!',colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.InfoEmbed(description=f'Теперь роль {role.mention} зарегистрирована!'))
|
||||||
else:
|
else:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта роль уже зарегистрирована!',colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта роль уже зарегистрирована!'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -70,7 +74,7 @@ class MainAdminModule(commands.Cog):
|
|||||||
async def GiveAPrizeRoleSlash(self, ctx, role: disnake.Role, member: disnake.Member):
|
async def GiveAPrizeRoleSlash(self, ctx, role: disnake.Role, member: disnake.Member):
|
||||||
await ctx.response.defer(ephemeral=True)
|
await ctx.response.defer(ephemeral=True)
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -81,7 +85,7 @@ class MainAdminModule(commands.Cog):
|
|||||||
stmt = self.DataBaseManager.select(roles_prize_model).where(roles_prize_model.id == role.id)
|
stmt = self.DataBaseManager.select(roles_prize_model).where(roles_prize_model.id == role.id)
|
||||||
role_prize = (await session.execute(stmt)).scalars().first()
|
role_prize = (await session.execute(stmt)).scalars().first()
|
||||||
if role_prize is None:
|
if role_prize is None:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Данная роль не зарегистрирована как призовая', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Данная роль не зарегистрирована как призовая'))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
async with self.DataBaseManager.models['received_roles_prize'] as received_roles_prize_model:
|
async with self.DataBaseManager.models['received_roles_prize'] as received_roles_prize_model:
|
||||||
@@ -91,13 +95,13 @@ class MainAdminModule(commands.Cog):
|
|||||||
)
|
)
|
||||||
received_roles_prize = (await session.execute(stmt)).scalars().first()
|
received_roles_prize = (await session.execute(stmt)).scalars().first()
|
||||||
if not received_roles_prize is None:
|
if not received_roles_prize is None:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'У {member.mention} уже есть роль {role.mention}', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'У {member.mention} уже есть роль {role.mention}'))
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
received_roles_prize = received_roles_prize_model(role_id = role.id, user_id = member.id)
|
received_roles_prize = received_roles_prize_model(role_id = role.id, user_id = member.id)
|
||||||
session.add(received_roles_prize)
|
session.add(received_roles_prize)
|
||||||
|
|
||||||
embed = disnake.Embed(description=f'Роль {role.mention} успешно передана {member.mention}!', colour=0x2F3136)
|
embed = self.client.InfoEmbed(description=f'Роль {role.mention} успешно передана {member.mention}!')
|
||||||
await member.add_roles(role)
|
await member.add_roles(role)
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
|
|
||||||
@@ -106,7 +110,7 @@ class MainAdminModule(commands.Cog):
|
|||||||
async def TakeAwayAPrizeRoleSlash(self, ctx, role: disnake.Role, member: disnake.Member):
|
async def TakeAwayAPrizeRoleSlash(self, ctx, role: disnake.Role, member: disnake.Member):
|
||||||
await ctx.response.defer(ephemeral=True)
|
await ctx.response.defer(ephemeral=True)
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -118,32 +122,36 @@ class MainAdminModule(commands.Cog):
|
|||||||
).with_for_update()
|
).with_for_update()
|
||||||
user_role = (await session.execute(stmt)).scalars().first()
|
user_role = (await session.execute(stmt)).scalars().first()
|
||||||
if user_role is None:
|
if user_role is None:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Данный пользователь не связан с этой ролью', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Данный пользователь не связан с этой ролью'))
|
||||||
return
|
return
|
||||||
|
|
||||||
await session.delete(user_role)
|
await session.delete(user_role)
|
||||||
embed = disnake.Embed(description=f'Роль {role.mention} удалена из инвентаря {member.mention}!', colour=0x2F3136)
|
embed = self.client.InfoEmbed(description=f'Роль {role.mention} удалена из инвентаря {member.mention}!')
|
||||||
await member.remove_roles(role)
|
await member.remove_roles(role)
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
|
|
||||||
|
|
||||||
@commands.slash_command(name="удалить_роль")
|
@commands.slash_command(name="удалить_роль")
|
||||||
async def DeleteRoleSlash(self, ctx: disnake.AppCmdInter, roleid: str):
|
async def DeleteRoleSlash(self, ctx: disnake.AppCmdInter, roleid: str):
|
||||||
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо в личных сообщениях'), ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
res = await self.client.DeleteRole(int(roleid))
|
res = await self.client.DeleteRole(int(roleid))
|
||||||
await ctx.send(embed=disnake.Embed(description=f'{res[1]}', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.InfoEmbed(description=f'{res[1]}'), ephemeral=True)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Введён неверный id', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Введён неверный id'), ephemeral=True)
|
||||||
|
|
||||||
|
|
||||||
@commands.slash_command(name="установить_описание_роли")
|
@commands.slash_command(name="установить_описание_роли")
|
||||||
async def RoleDescriptoinSetSlash(self, ctx, role: disnake.Role, description: str):
|
async def RoleDescriptoinSetSlash(self, ctx, role: disnake.Role, description: str):
|
||||||
await ctx.response.defer(ephemeral=True)
|
await ctx.response.defer(ephemeral=True)
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -158,15 +166,19 @@ class MainAdminModule(commands.Cog):
|
|||||||
session.add(role)
|
session.add(role)
|
||||||
else:
|
else:
|
||||||
role_static.description = description
|
role_static.description = description
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Для роли {role.mention} успешно установлено описание\n```{description}```', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.InfoEmbed(description=f'Для роли {role.mention} успешно установлено описание\n```{description}```'))
|
||||||
return
|
return
|
||||||
|
|
||||||
@commands.slash_command(name = "изменить_параметр")
|
@commands.slash_command(name = "изменить_параметр")
|
||||||
async def ChangeParamSlash(self, ctx: disnake.AppCmdInter, member: disnake.Member, vector: int, parameter: str = commands.Param(description="Какой параметр хотите изменить?",
|
async def ChangeParamSlash(self, ctx: disnake.AppCmdInter, member: disnake.Member, vector: int, parameter: str = commands.Param(description="Какой параметр хотите изменить?",
|
||||||
name="параметр",
|
name="параметр",
|
||||||
choices=['крошки', 'сообщения', 'секунды в голосовом канале', 'репутация', 'зарплата'])):
|
choices=['крошки', 'сообщения', 'секунды в голосовом канале', 'репутация', 'зарплата'])):
|
||||||
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо в личных сообщениях'), ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -196,16 +208,20 @@ class MainAdminModule(commands.Cog):
|
|||||||
case 'зарплата':
|
case 'зарплата':
|
||||||
user.staff_salary += vector
|
user.staff_salary += vector
|
||||||
count = user.staff_salary
|
count = user.staff_salary
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Количество {parameter} пользователя {member.mention} успешно изменено до `{count}`', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.InfoEmbed(description=f'Количество {parameter} пользователя {member.mention} успешно изменено до `{count}`'), ephemeral=True)
|
||||||
|
|
||||||
@commands.slash_command(name = "дать_зверя")
|
@commands.slash_command(name = "дать_зверя")
|
||||||
async def GiveRimagochiAnimalSlash(self, ctx: disnake.AppCmdInter, member: disnake.Member, animal_id: int):
|
async def GiveRimagochiAnimalSlash(self, ctx: disnake.AppCmdInter, member: disnake.Member, animal_id: int):
|
||||||
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо в личных сообщениях'), ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
if not animal_id in rimagochi_animals.keys():
|
if not animal_id in rimagochi_animals.keys():
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Некорректный идентификатор животного', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Некорректный идентификатор животного'), ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -214,12 +230,16 @@ class MainAdminModule(commands.Cog):
|
|||||||
async with self.DataBaseManager.models['rimagochi_animals'] as rimagochi_animals_model:
|
async with self.DataBaseManager.models['rimagochi_animals'] as rimagochi_animals_model:
|
||||||
animal = rimagochi_animals_model(model_animal_id = animal_id, initial_owner_id = ctx.author.id, owner_id = member.id)
|
animal = rimagochi_animals_model(model_animal_id = animal_id, initial_owner_id = ctx.author.id, owner_id = member.id)
|
||||||
session.add(animal)
|
session.add(animal)
|
||||||
await ctx.send(embed=disnake.Embed(description=f'{member.mention} успешно получил `{rimagochi_animals[animal_id]["name"]}`', colour=0xff9900), ephemeral=True)
|
await ctx.send(embed=self.client.InfoEmbed(description=f'{member.mention} успешно получил `{rimagochi_animals[animal_id]["name"]}`'), ephemeral=True)
|
||||||
|
|
||||||
@commands.slash_command(name = "удалить_зверя")
|
@commands.slash_command(name = "удалить_зверя")
|
||||||
async def RemoveRimagochiAnimalSlash(self, ctx: disnake.AppCmdInter, inventory_id: int):
|
async def RemoveRimagochiAnimalSlash(self, ctx: disnake.AppCmdInter, inventory_id: int):
|
||||||
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Не допустимо в личных сообщениях'), ephemeral=True)
|
||||||
|
return
|
||||||
|
|
||||||
if not self.me in ctx.author.roles:
|
if not self.me in ctx.author.roles:
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.ErrEmbed(description=f'Эта команда доступна только администратору'))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -231,29 +251,9 @@ class MainAdminModule(commands.Cog):
|
|||||||
animal = (await session.execute(stmt)).scalars().first()
|
animal = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if animal is None:
|
if animal is None:
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Животного с таким идентификатором не обнаружено', colour=0x2F3136), ephemeral=True)
|
await ctx.send(embed=self.client.ErrEmbed(description=f'Животного с таким идентификатором не обнаружено'), ephemeral=True)
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
await session.delete(animal)
|
await session.delete(animal)
|
||||||
await ctx.send(embed=disnake.Embed(description=f"<@{animal.owner_id}> лишился `{rimagochi_animals[animal.model_animal_id]['name']}` с id `{inventory_id}`",
|
await ctx.send(embed=self.client.InfoEmbed(description=f"<@{animal.owner_id}> лишился `{rimagochi_animals[animal.model_animal_id]['name']}` с id `{inventory_id}`"), ephemeral=True)
|
||||||
colour=0xff9900), ephemeral=True)
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@commands.slash_command(name = "температура")
|
|
||||||
async def RaspberryTemperature(self, ctx: disnake.AppCmdInter):
|
|
||||||
if not self.me in ctx.author.roles:
|
|
||||||
await ctx.send(embed=disnake.Embed(description=f'Эта команда доступна только администратору', colour=0x2F3136))
|
|
||||||
return
|
|
||||||
def redgreen(temper, minimum, maximum):
|
|
||||||
if temper == ((maximum+minimum)/2):
|
|
||||||
return [255, 255, 0]
|
|
||||||
if temper > ((maximum+minimum)/2):
|
|
||||||
return [255, max(0, min(int((1-((temper-minimum)/(maximum-minimum)))*255), 255)), 0]
|
|
||||||
if temper < ((maximum+minimum)/2):
|
|
||||||
return [max(0, min(int(((temper-minimum)/(maximum-minimum))*255), 255)), 255, 0]
|
|
||||||
try:
|
|
||||||
with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
|
|
||||||
temp = f.read()
|
|
||||||
except:
|
|
||||||
temp = "0"
|
|
||||||
await ctx.send(embed=disnake.Embed(description=f"Температура CPU {str(int(temp) / 1000)} °C", colour=disnake.Color.from_rgb(*redgreen(int(temp)/1000, 30, 70))))
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class MainDesignerModule(commands.Cog):
|
|||||||
self.krekchat = await self.client.fetch_guild(constants["krekchat"])
|
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.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"])
|
self.me = disnake.utils.get(self.krekchat.roles, id=constants["me"])
|
||||||
print(f'KrekFunBot designer module activated')
|
self.client.logger.info(f'KrekFunBot designer module activated')
|
||||||
|
|
||||||
@commands.slash_command(name = "профиль", description="Ваш профиль на сервере")
|
@commands.slash_command(name = "профиль", description="Ваш профиль на сервере")
|
||||||
async def Profile(self, ctx: disnake.AppCmdInter,
|
async def Profile(self, ctx: disnake.AppCmdInter,
|
||||||
@@ -49,7 +49,8 @@ class MainDesignerModule(commands.Cog):
|
|||||||
user = await session.get(users_model, member.id)
|
user = await session.get(users_model, member.id)
|
||||||
|
|
||||||
if user is None:
|
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 ''}")
|
embed = self.client.ErrEmbed(title="Ошибка профиля", description=f"{'Вас' if member == ctx.author else 'Этого пользователя'} пока нет в базе данных{', напишите хотя бы одно сообщение' if member == ctx.author else ''}")
|
||||||
|
await ctx.edit_original_message(embed=embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
rating = users_model.period_messages + (users_model.period_voice_activity / 180.0)
|
rating = users_model.period_messages + (users_model.period_voice_activity / 180.0)
|
||||||
@@ -78,7 +79,7 @@ class MainDesignerModule(commands.Cog):
|
|||||||
design = design.design
|
design = design.design
|
||||||
|
|
||||||
if old_style:
|
if old_style:
|
||||||
embed = disnake.Embed(title=f"Профиль **{member.display_name}**", description=f'')
|
embed = self.client.InfoEmbed(title=f"Профиль **{member.display_name}**", description=f'')
|
||||||
|
|
||||||
embed.colour = 0x2F3136
|
embed.colour = 0x2F3136
|
||||||
embed.set_thumbnail(url=member.avatar)
|
embed.set_thumbnail(url=member.avatar)
|
||||||
@@ -103,7 +104,8 @@ class MainDesignerModule(commands.Cog):
|
|||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
if design.render_profile_code is None:
|
if design.render_profile_code is None:
|
||||||
await self.client.ErrorOutHelper(send_function = ctx.edit_original_message).out(n="Ошибка профиля", d=f"Для этой темы профиля не определена функция render. Свяжитесь с разработчиком для решения этой проблемы")
|
embed = self.client.ErrEmbed(title="Ошибка профиля", description=f"Для этой темы профиля не определена функция render. Свяжитесь с разработчиком для решения этой проблемы")
|
||||||
|
await ctx.edit_original_message(embed=embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
avatar_asset = member.avatar or member.default_avatar
|
avatar_asset = member.avatar or member.default_avatar
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class MainEconomyModule(commands.Cog):
|
|||||||
self.krekchat = await self.client.fetch_guild(constants["krekchat"])
|
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.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"])
|
self.me = disnake.utils.get(self.krekchat.roles, id=constants["me"])
|
||||||
print(f'KrekFunBot economy module activated')
|
self.client.logger.info(f'KrekFunBot economy module activated')
|
||||||
|
|
||||||
@commands.slash_command(name = "статистика", description="Статистика отображает все данные о пользователе")
|
@commands.slash_command(name = "статистика", description="Статистика отображает все данные о пользователе")
|
||||||
async def UserStatistic(self, ctx: disnake.AppCmdInter,
|
async def UserStatistic(self, ctx: disnake.AppCmdInter,
|
||||||
@@ -37,11 +37,11 @@ class MainEconomyModule(commands.Cog):
|
|||||||
member = ctx.author
|
member = ctx.author
|
||||||
|
|
||||||
if ctx.guild is None:
|
if ctx.guild is None:
|
||||||
embed = disnake.Embed(title=f"Статистика **{member.name}**", description=f'')
|
embed = self.client.InfoEmbed(title=f"Статистика **{member.name}**", description=f'')
|
||||||
elif member.nick != None:
|
elif member.nick != None:
|
||||||
embed = disnake.Embed(title=f"Статистика **{member.nick}**", description=f'')
|
embed = self.client.InfoEmbed(title=f"Статистика **{member.nick}**", description=f'')
|
||||||
else:
|
else:
|
||||||
embed = disnake.Embed(title=f"Статистика **{member.name}**", description=f'')
|
embed = self.client.InfoEmbed(title=f"Статистика **{member.name}**", description=f'')
|
||||||
|
|
||||||
embed.set_thumbnail(url=member.avatar)
|
embed.set_thumbnail(url=member.avatar)
|
||||||
|
|
||||||
@@ -54,7 +54,8 @@ class MainEconomyModule(commands.Cog):
|
|||||||
async with session.begin():
|
async with session.begin():
|
||||||
user = await session.get(users_model, member.id)
|
user = await session.get(users_model, member.id)
|
||||||
if user is None:
|
if user is None:
|
||||||
await self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка статистики").out(d="Такого пользователя нет в базе данных")
|
embed = self.client.ErrEmbed(title="Ошибка статистики", description="Такого пользователя нет в базе данных")
|
||||||
|
await ctx.edit_original_message(embed=embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
stmt = self.DataBaseManager.select(users_model).options(
|
stmt = self.DataBaseManager.select(users_model).options(
|
||||||
@@ -126,10 +127,12 @@ class MainEconomyModule(commands.Cog):
|
|||||||
order_by = [self.DataBaseManager.desc(users_model.period_voice_activity), self.DataBaseManager.desc(users_model.period_messages)]
|
order_by = [self.DataBaseManager.desc(users_model.period_voice_activity), self.DataBaseManager.desc(users_model.period_messages)]
|
||||||
case "по количеству крошек":
|
case "по количеству крошек":
|
||||||
order_by = [self.DataBaseManager.desc(users_model.crumbs), self.DataBaseManager.desc(users_model.period_messages), self.DataBaseManager.desc(users_model.period_voice_activity)]
|
order_by = [self.DataBaseManager.desc(users_model.crumbs), self.DataBaseManager.desc(users_model.period_messages), self.DataBaseManager.desc(users_model.period_voice_activity)]
|
||||||
|
if order_by is None:
|
||||||
|
return
|
||||||
stmt = self.DataBaseManager.select(users_model).order_by(*order_by).limit(20)
|
stmt = self.DataBaseManager.select(users_model).order_by(*order_by).limit(20)
|
||||||
users = (await session.execute(stmt)).scalars().all()
|
users = (await session.execute(stmt)).scalars().all()
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Общий топ {parameter}", description=f'', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Общий топ {parameter}", description=f'')
|
||||||
users_counter = 0
|
users_counter = 0
|
||||||
for user in users:
|
for user in users:
|
||||||
try:
|
try:
|
||||||
@@ -176,9 +179,10 @@ class MainEconomyModule(commands.Cog):
|
|||||||
name="награда")
|
name="награда")
|
||||||
async def DailyCrumbsSub(self, ctx: disnake.AppCmdInter):
|
async def DailyCrumbsSub(self, ctx: disnake.AppCmdInter):
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка начисления ежедневной награды")
|
err_embed = self.client.ErrEmbed(title="Ошибка начисления ежедневной награды")
|
||||||
if ctx.guild is None:
|
if ctx.guild is None:
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
err_embed.description = "Эта команда не работает в личных сообщениях!"
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
await self.client.UserUpdate(member = ctx.author, session = session)
|
await self.client.UserUpdate(member = ctx.author, session = session)
|
||||||
@@ -192,10 +196,11 @@ class MainEconomyModule(commands.Cog):
|
|||||||
if result['success']:
|
if result['success']:
|
||||||
history = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = result['count'], description = f"Ежедневная награда за {result['date'].strftime('%d.%m.%Y')}")
|
history = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = result['count'], description = f"Ежедневная награда за {result['date'].strftime('%d.%m.%Y')}")
|
||||||
session.add(history)
|
session.add(history)
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(description=result['output'], colour=0x2F3136))
|
await ctx.edit_original_message(embed=self.client.InfoEmbed(description=result['output']))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
await error_helper.out(d=result['output'])
|
err_embed.description = result['output']
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@@ -203,11 +208,13 @@ class MainEconomyModule(commands.Cog):
|
|||||||
async def HistoryCrumbsSlash(self, ctx: disnake.AppCmdInter):
|
async def HistoryCrumbsSlash(self, ctx: disnake.AppCmdInter):
|
||||||
pass
|
pass
|
||||||
@HistoryCrumbsSlash.sub_command(description="Показывает историю транзакций", name="транзакций")
|
@HistoryCrumbsSlash.sub_command(description="Показывает историю транзакций", name="транзакций")
|
||||||
async def HistoryCrumbsSub(self, ctx: disnake.AppCmdInter, member: disnake.Member = commands.Param(
|
async def HistoryCrumbsSub(self, ctx: disnake.AppCmdInter, member_inp: disnake.Member = commands.Param(
|
||||||
description="Чью историю хотите посмотреть?(только для администраторов)",
|
description="Чью историю хотите посмотреть?(только для администраторов)",
|
||||||
name="участник", default=None)):
|
name="участник", default=None)):
|
||||||
if not (member != None and self.me in ctx.author.roles):
|
|
||||||
member = ctx.author
|
member = ctx.author
|
||||||
|
if isinstance(ctx.author, disnake.Member) and (member_inp is not None) and (self.me in ctx.author.roles):
|
||||||
|
member = member_inp
|
||||||
class HistoryButtons(disnake.ui.View):
|
class HistoryButtons(disnake.ui.View):
|
||||||
def __init__(self, ctx, transactions, member, embed):
|
def __init__(self, ctx, transactions, member, embed):
|
||||||
super().__init__(timeout=180)
|
super().__init__(timeout=180)
|
||||||
@@ -276,7 +283,7 @@ class MainEconomyModule(commands.Cog):
|
|||||||
embed.add_field(name=f"", value=f"Страница {selfpage}/{maxpage}", inline=False)
|
embed.add_field(name=f"", value=f"Страница {selfpage}/{maxpage}", inline=False)
|
||||||
return embed
|
return embed
|
||||||
await ctx.response.defer(ephemeral = True)
|
await ctx.response.defer(ephemeral = True)
|
||||||
embed = disnake.Embed(title=f'История транзакций {member.name}', description=f"", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f'История транзакций {member.name}', description=f"")
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
@@ -300,16 +307,19 @@ class MainEconomyModule(commands.Cog):
|
|||||||
description="Хотите иметь очень много крошек? Тогда, эта команда точно не для вас)")
|
description="Хотите иметь очень много крошек? Тогда, эта команда точно не для вас)")
|
||||||
async def CasinoSlash(self, ctx: disnake.AppCmdInter,
|
async def CasinoSlash(self, ctx: disnake.AppCmdInter,
|
||||||
count: commands.Range[int, 1, ...] = commands.Param(description="Сколько крошек хотите поставить на кон?", name="ставка"),
|
count: commands.Range[int, 1, ...] = commands.Param(description="Сколько крошек хотите поставить на кон?", name="ставка"),
|
||||||
possibility: commands.Range[int, 1, 99] = commands.Param(
|
possibility_input: commands.Range[int, 1, 99] = commands.Param(
|
||||||
description="Шанс на победу. Чем выше, тем меньше крошек вы получите после победы(целое число от 1 до 99)",
|
description="Шанс на победу. Чем выше, тем меньше крошек вы получите после победы(целое число от 1 до 99)",
|
||||||
name="шанс", default=50),
|
name="шанс", default=50),
|
||||||
quantity: int = commands.Param(
|
quantity: int = commands.Param(
|
||||||
description=f"Количество круток(целое число от 1 до {constants['casinospinslimit']}({constants['casinospinslimit']*2} для спонсоров))",
|
description=f"Количество круток(целое число от 1 до {constants['casinospinslimit']}({constants['casinospinslimit']*2} для спонсоров))",
|
||||||
name="количество", default=1)):
|
name="количество", default=1)):
|
||||||
|
possibility = float(possibility_input)
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка казино")
|
|
||||||
if ctx.guild is None:
|
err_embed = self.client.ErrEmbed(title="Ошибка казино")
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
if isinstance(ctx.author, disnake.User) or ctx.guild is None:
|
||||||
|
err_embed.description = "Эта команда не работает в личных сообщениях!"
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
def get_dynamic_fee(count: int) -> float:
|
def get_dynamic_fee(count: int) -> float:
|
||||||
if count < 1_000:
|
if count < 1_000:
|
||||||
@@ -349,21 +359,25 @@ class MainEconomyModule(commands.Cog):
|
|||||||
user_is_sponsor = await user.in_role(member = ctx.author, roles = self.sponsors)
|
user_is_sponsor = await user.in_role(member = ctx.author, roles = self.sponsors)
|
||||||
casinospinslimit = constants['casinospinslimit']
|
casinospinslimit = constants['casinospinslimit']
|
||||||
if quantity <= 0:
|
if quantity <= 0:
|
||||||
await error_helper.out(d=f'Количество круток должно быть > 0')
|
err_embed.description = f'Количество круток должно быть > 0'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
if quantity > casinospinslimit * (user_is_sponsor + 1) and (not self.me in ctx.author.roles):
|
if quantity > casinospinslimit * (user_is_sponsor + 1) and (not self.me in ctx.author.roles):
|
||||||
await error_helper.out(d=f'Вы не можете крутить казино больше {casinospinslimit * (user_is_sponsor + 1)} раз в день!')
|
err_embed.description = f'Вы не можете крутить казино больше {casinospinslimit * (user_is_sponsor + 1)} раз в день!'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
if not 0 < possibility < 100:
|
if not 0 < possibility < 100:
|
||||||
await error_helper.out(d=f'Шанс должен быть от 1% до 99%')
|
err_embed.description = f'Шанс должен быть от 1% до 99%'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
possibility = possibility / 100
|
possibility = possibility / 100
|
||||||
if count <= 0:
|
if count <= 0:
|
||||||
await error_helper.out(d=f'Ставка должна быть больше 0')
|
err_embed.description = f'Ставка должна быть больше 0'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
if user.crumbs < count * quantity:
|
if user.crumbs < count * quantity:
|
||||||
await error_helper.out(d=f'Для такой ставки вам необходимо иметь {quantity*count} крошек')
|
err_embed.description = f'Для такой ставки вам необходимо иметь {quantity*count} крошек'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
now = datetime.datetime.now().timestamp()
|
now = datetime.datetime.now().timestamp()
|
||||||
@@ -374,9 +388,11 @@ class MainEconomyModule(commands.Cog):
|
|||||||
|
|
||||||
if casino_user.spins_today_count + quantity > casinospinslimit * (user_is_sponsor + 1) and (not self.me in ctx.author.roles):
|
if casino_user.spins_today_count + quantity > casinospinslimit * (user_is_sponsor + 1) and (not self.me in ctx.author.roles):
|
||||||
if casino_user.spins_today_count >= casinospinslimit * (user_is_sponsor + 1):
|
if casino_user.spins_today_count >= casinospinslimit * (user_is_sponsor + 1):
|
||||||
await error_helper.out(d=f'У вас не осталось круток, возобновление лимита будет <t:{casino_user.last_reset_time + 86400}:R>')
|
err_embed.description = f'У вас не осталось круток, возобновление лимита будет <t:{casino_user.last_reset_time + 86400}:R>'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
else:
|
else:
|
||||||
await error_helper.out(d=f'У вас осталось только {casinospinslimit * (user_is_sponsor + 1) - (casino_user.spins_today_count)} круток, возобновление лимита будет <t:{casino_user.last_reset_time + 86400}:R>')
|
err_embed.description = f'У вас осталось только {casinospinslimit * (user_is_sponsor + 1) - (casino_user.spins_today_count)} круток, возобновление лимита будет <t:{casino_user.last_reset_time + 86400}:R>'
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
results = [random.random() < possibility for _ in range(quantity)]
|
results = [random.random() < possibility for _ in range(quantity)]
|
||||||
@@ -389,14 +405,16 @@ class MainEconomyModule(commands.Cog):
|
|||||||
if int(totalcrumbs)>0:
|
if int(totalcrumbs)>0:
|
||||||
history = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = int(totalcrumbs), description = f"Выигрыш в казино с шансом {int(possibility * 100)}% и ставкой {count} крошек ({totalwins} побед, {quantity-totalwins} поражений)")
|
history = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = int(totalcrumbs), description = f"Выигрыш в казино с шансом {int(possibility * 100)}% и ставкой {count} крошек ({totalwins} побед, {quantity-totalwins} поражений)")
|
||||||
session.add(history)
|
session.add(history)
|
||||||
embed=disnake.Embed(title=f'Вы в плюсе!', description=f"Ваш выигрыш составил {int(totalcrumbs)}!", colour=0x2F3136)
|
embed=self.client.InfoEmbed(title=f'Вы в плюсе!', description=f"Ваш выигрыш составил {int(totalcrumbs)}!")
|
||||||
elif int(totalcrumbs) == 0:
|
elif int(totalcrumbs) == 0:
|
||||||
embed=disnake.Embed(title=f'Вы вышли в 0',description=f"", colour=0x2F3136)
|
embed=self.client.InfoEmbed(title=f'Вы вышли в 0',description=f"")
|
||||||
else:
|
else:
|
||||||
history = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = int(abs(totalcrumbs)), description = f"Проигрыш в казино с шансом {int(possibility * 100)}% и ставкой {count} крошек ({totalwins} побед, {quantity-totalwins} поражений)")
|
history = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = int(abs(totalcrumbs)), description = f"Проигрыш в казино с шансом {int(possibility * 100)}% и ставкой {count} крошек ({totalwins} побед, {quantity-totalwins} поражений)")
|
||||||
session.add(history)
|
session.add(history)
|
||||||
embed=disnake.Embed(title=f'Вы в минусе(', description=f"Ваш проигрыш составил {int(-totalcrumbs)}", colour=0x2F3136)
|
embed=self.client.InfoEmbed(title=f'Вы в минусе(', description=f"Ваш проигрыш составил {int(-totalcrumbs)}")
|
||||||
|
|
||||||
|
if embed.description is None:
|
||||||
|
raise ValueError("embed.description в казино = None")
|
||||||
embed.description += (f"\n-# У вас осталось {casinospinslimit * (user_is_sponsor + 1) - (casino_user.spins_today_count)} круток")
|
embed.description += (f"\n-# У вас осталось {casinospinslimit * (user_is_sponsor + 1) - (casino_user.spins_today_count)} круток")
|
||||||
await ctx.edit_original_message(embed = embed)
|
await ctx.edit_original_message(embed = embed)
|
||||||
|
|
||||||
@@ -414,16 +432,17 @@ class MainEconomyModule(commands.Cog):
|
|||||||
default="Перевод"),
|
default="Перевод"),
|
||||||
commission: float = commands.Param(description="Доля комиссии(доступно только админам)",
|
commission: float = commands.Param(description="Доля комиссии(доступно только админам)",
|
||||||
name="комиссия", default=None)):
|
name="комиссия", default=None)):
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.response.send_message, err_name = "Ошибка перевода")
|
|
||||||
if ctx.guild is None:
|
err_embed = self.client.ErrEmbed(err_func = ctx.response.send_message, title="Ошибка перевода")
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
if isinstance(ctx.author, disnake.User):
|
||||||
|
await err_embed.send("Эта команда не работает в личных сообщениях!")
|
||||||
return
|
return
|
||||||
if comment != "Перевод":
|
if comment != "Перевод":
|
||||||
comment = "Перевод | " + comment
|
comment = "Перевод | " + comment
|
||||||
if (commission == None) or (not self.me in ctx.author.roles):
|
if (commission == None) or (not self.me in ctx.author.roles) or (ctx.author.id == 515542927158804480):
|
||||||
commission = constants['givecrumbscommission']
|
commission = constants['givecrumbscommission']
|
||||||
if count <= 0:
|
if count <= 0:
|
||||||
await error_helper.out(d="Количество крошек должно быть больше 0")
|
await err_embed.send("Количество крошек должно быть больше 0")
|
||||||
return
|
return
|
||||||
users_model = self.DataBaseManager.models['users'].m
|
users_model = self.DataBaseManager.models['users'].m
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -432,15 +451,15 @@ class MainEconomyModule(commands.Cog):
|
|||||||
member_data = await session.get(users_model, member.id, with_for_update = True)
|
member_data = await session.get(users_model, member.id, with_for_update = True)
|
||||||
|
|
||||||
if author_data is None:
|
if author_data is None:
|
||||||
await error_helper.out(d=f'Вас нет в базе данных')
|
await err_embed.send(f'Вас нет в базе данных')
|
||||||
return
|
return
|
||||||
|
|
||||||
if member_data is None:
|
if member_data is None:
|
||||||
await error_helper.out(d=f'Такого пользователя нет в базе данных')
|
await err_embed.send(f'Такого пользователя нет в базе данных')
|
||||||
return
|
return
|
||||||
|
|
||||||
if author_data.crumbs - count < 0:
|
if author_data.crumbs - count < 0:
|
||||||
await error_helper.out(d=f'У вас не хватает крошек')
|
await err_embed.send(f'У вас не хватает крошек')
|
||||||
return
|
return
|
||||||
|
|
||||||
history_write = self.DataBaseManager.models["transaction_history_crumbs"].m(sender_id = ctx.author.id, recipient_id = member.id, commission_fraction = commission, description = comment, amount = count)
|
history_write = self.DataBaseManager.models["transaction_history_crumbs"].m(sender_id = ctx.author.id, recipient_id = member.id, commission_fraction = commission, description = comment, amount = count)
|
||||||
@@ -448,6 +467,5 @@ class MainEconomyModule(commands.Cog):
|
|||||||
author_data.crumbs -= count
|
author_data.crumbs -= count
|
||||||
member_data.crumbs += count * (1 - commission)
|
member_data.crumbs += count * (1 - commission)
|
||||||
|
|
||||||
await ctx.response.send_message(embed=disnake.Embed(
|
await ctx.response.send_message(embed=self.client.InfoEmbed(
|
||||||
description=f'{count} крошек успешно отправлено на счёт {member.mention}, комиссия составила {int(commission * 100)}%({int(count * commission)} крошек)',
|
description=f'{count} крошек успешно отправлено на счёт {member.mention}, комиссия составила {int(commission * 100)}%({int(count * commission)} крошек)'))
|
||||||
colour=0x2F3136))
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
import disnake
|
import disnake
|
||||||
from disnake.ext import commands
|
from disnake.ext import commands
|
||||||
|
|
||||||
def setup(bot: commands.Bot):
|
def setup(bot):
|
||||||
bot.add_cog(ExampleCog(bot))
|
bot.add_cog(ExampleCog(bot))
|
||||||
print("ExampleCog загружен!")
|
bot.logger.info("ExampleCog загружен!")
|
||||||
|
|
||||||
class ExampleCog(commands.Cog):
|
class ExampleCog(commands.Cog):
|
||||||
def __init__(self, bot: commands.Bot):
|
def __init__(self, bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@commands.slash_command(name="ping", description="Проверка бота на работоспособность")
|
@commands.slash_command(name="ping", description="Проверка бота на работоспособность")
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@commands.Cog.listener()
|
@commands.Cog.listener()
|
||||||
async def on_ready(self):
|
async def on_ready(self):
|
||||||
print(f'KrekFunBot rimagochi module activated')
|
self.client.logger.info(f'KrekFunBot rimagochi module activated')
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
self.me = disnake.utils.get(krekchat.roles, id=constants["me"])
|
self.me = disnake.utils.get(krekchat.roles, id=constants["me"])
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
async def RimagochiPlayerProfileSub(self, ctx: disnake.AppCmdInter,
|
async def RimagochiPlayerProfileSub(self, ctx: disnake.AppCmdInter,
|
||||||
member: disnake.Member = commands.Param(description="Чей профиль хотите посмотреть?",
|
member: disnake.Member = commands.Param(description="Чей профиль хотите посмотреть?",
|
||||||
name="игрок", default=None)):
|
name="игрок", default=None)):
|
||||||
if member == None:
|
if member is None:
|
||||||
member = ctx.author
|
member = ctx.author
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
if member == ctx.author:
|
if member == ctx.author:
|
||||||
@@ -62,8 +62,11 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
else:
|
else:
|
||||||
user = await session.get(self.DataBaseManager.models['rimagochi_users'].m, member.id)
|
user = await session.get(self.DataBaseManager.models['rimagochi_users'].m, member.id)
|
||||||
if user is None:
|
if user is None:
|
||||||
await self.client.ErrorOutHelper(send_function = ctx.response.send_message, err_name = "Ошибка профиля", thumbnail = member.avatar).out(d=f"Этот пользователь скрывает свои данные")
|
err_embed = self.client.ErrEmbed(title = "Ошибка профиля", thumbnail = member.avatar, description = f"Пользователь не найден")
|
||||||
|
await ctx.response.send_message(embed = err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
async with self.DataBaseManager.models['rimagochi_users'] as rimagochi_users_model:
|
async with self.DataBaseManager.models['rimagochi_users'] as rimagochi_users_model:
|
||||||
stmt = self.DataBaseManager.select(rimagochi_users_model).options(
|
stmt = self.DataBaseManager.select(rimagochi_users_model).options(
|
||||||
@@ -74,13 +77,20 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
)
|
)
|
||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if member != ctx.author and user.settings['hide_the_animals'] and (not self.client.me in ctx.author.roles):
|
if not isinstance(ctx.author, disnake.Member):
|
||||||
await self.client.ErrorOutHelper(send_function = ctx.response.send_message, err_name = "Ошибка профиля", thumbnail = member.avatar).out(d=f"Этот пользователь скрывает свои данные")
|
if (member != ctx.author and user.settings['hide_the_animals']):
|
||||||
return
|
err_embed = self.client.ErrEmbed(title = "Ошибка профиля", thumbnail = member.avatar, description = f"Этот пользователь скрывает свои данные")
|
||||||
|
await ctx.response.send_message(embed = err_embed)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if (member != ctx.author and user.settings['hide_the_animals']) and (not self.client.me in ctx.author.roles):
|
||||||
|
err_embed = self.client.ErrEmbed(title = "Ошибка профиля", thumbnail = member.avatar, description = f"Этот пользователь скрывает свои данные")
|
||||||
|
await ctx.response.send_message(embed = err_embed)
|
||||||
|
return
|
||||||
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
||||||
|
|
||||||
strength = await self.client.CalculateRimagochiBattleStrength(user.battle_slots_animals)
|
strength = await self.client.CalculateRimagochiBattleStrength(user.battle_slots_animals)
|
||||||
embed = disnake.Embed(title=f"", description=f"### Профиль игрока {member.mention}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"### Профиль игрока {member.mention}")
|
||||||
embed.set_thumbnail(url=member.avatar)
|
embed.set_thumbnail(url=member.avatar)
|
||||||
embed.add_field(name=f"Победы в битвах", value=f"{user.wins}", inline=False)
|
embed.add_field(name=f"Победы в битвах", value=f"{user.wins}", inline=False)
|
||||||
embed.add_field(name=f"Cила отряда", value=f"{strength}", inline=True)
|
embed.add_field(name=f"Cила отряда", value=f"{strength}", inline=True)
|
||||||
@@ -111,7 +121,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="1", style=disnake.ButtonStyle.primary)
|
@disnake.ui.button(label="1", style=disnake.ButtonStyle.primary)
|
||||||
async def button1_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def button1_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Вы не можете менять настройки другого пользователя")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете менять настройки другого пользователя")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.settings['hide_the_animals'] = not self.settings['hide_the_animals']
|
self.settings['hide_the_animals'] = not self.settings['hide_the_animals']
|
||||||
@@ -121,7 +132,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="2", style=disnake.ButtonStyle.primary)
|
@disnake.ui.button(label="2", style=disnake.ButtonStyle.primary)
|
||||||
async def button2_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def button2_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Вы не можете менять настройки другого пользователя")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете менять настройки другого пользователя")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.settings['always_use_crumbs_for_feeding'] = not self.settings['always_use_crumbs_for_feeding']
|
self.settings['always_use_crumbs_for_feeding'] = not self.settings['always_use_crumbs_for_feeding']
|
||||||
@@ -131,7 +143,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="3", style=disnake.ButtonStyle.primary)
|
@disnake.ui.button(label="3", style=disnake.ButtonStyle.primary)
|
||||||
async def button3_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def button3_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Вы не можете менять настройки другого пользователя")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете менять настройки другого пользователя")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.settings['accept_the_challenge'] = not self.settings['accept_the_challenge']
|
self.settings['accept_the_challenge'] = not self.settings['accept_the_challenge']
|
||||||
@@ -149,7 +162,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
await ctx.edit_original_message(view=None)
|
await ctx.edit_original_message(view=None)
|
||||||
|
|
||||||
def SettingsEmbedMaker(settings):
|
def SettingsEmbedMaker(settings):
|
||||||
embed = disnake.Embed(title=f"Глобальные настройки", description=f'')
|
embed = self.client.InfoEmbed(title=f"Глобальные настройки", description=f'')
|
||||||
embed.set_thumbnail(url=ctx.author.avatar)
|
embed.set_thumbnail(url=ctx.author.avatar)
|
||||||
embed.add_field(name=f"1) Скрывать свои данные", value="Отключено" if not settings['hide_the_animals'] else "Включено", inline=False)
|
embed.add_field(name=f"1) Скрывать свои данные", value="Отключено" if not settings['hide_the_animals'] else "Включено", inline=False)
|
||||||
embed.add_field(name=f"2) Всегда использовать крошки для кормления животных", value="Отключено" if not settings['always_use_crumbs_for_feeding'] else "Включено", inline=False)
|
embed.add_field(name=f"2) Всегда использовать крошки для кормления животных", value="Отключено" if not settings['always_use_crumbs_for_feeding'] else "Включено", inline=False)
|
||||||
@@ -179,7 +192,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@OpenGachaSlash.sub_command(description="После открытия капсулы, вы получаете боевого питомца", name="капсулу")
|
@OpenGachaSlash.sub_command(description="После открытия капсулы, вы получаете боевого питомца", name="капсулу")
|
||||||
async def OpenGachaSub(self, ctx: disnake.AppCmdInter,
|
async def OpenGachaSub(self, ctx: disnake.AppCmdInter,
|
||||||
capsule: int = commands.Param(description="Название капсулы",
|
capsule_id: int = commands.Param(description="Название капсулы",
|
||||||
name="капсула",
|
name="капсула",
|
||||||
choices=[disnake.OptionChoice(name=f"{i['name']} - {i['cost']} крошек", value=i['id']) for i in rimagochi_capsules.values()])):
|
choices=[disnake.OptionChoice(name=f"{i['name']} - {i['cost']} крошек", value=i['id']) for i in rimagochi_capsules.values()])):
|
||||||
def get_random_rarity(chances):
|
def get_random_rarity(chances):
|
||||||
@@ -207,11 +220,11 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка открытия капсулы")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка открытия капсулы")
|
||||||
capsule = rimagochi_capsules[capsule]
|
capsule = rimagochi_capsules[capsule_id]
|
||||||
|
|
||||||
if user.crumbs < capsule['cost']:
|
if user.crumbs < capsule['cost']:
|
||||||
await error_helper.out(d=f"Для открытия этой капсулы необходимо иметь {capsule['cost']} крошек")
|
await err_embed.send(f"Для открытия этой капсулы необходимо иметь {capsule['cost']} крошек")
|
||||||
return
|
return
|
||||||
|
|
||||||
timed_animals = {}
|
timed_animals = {}
|
||||||
@@ -236,7 +249,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
new_animal_id = new_animal.id
|
new_animal_id = new_animal.id
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"{rarity['emoji']} {animal['name'].capitalize()} ({(chance*100):.02f}%)", description=f"{animal['description']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{rarity['emoji']} {animal['name'].capitalize()} ({(chance*100):.02f}%)", description=f"{animal['description']}", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url = animal['params']['image_url'])
|
embed.set_thumbnail(url = animal['params']['image_url'])
|
||||||
|
|
||||||
class SlaughterView(disnake.ui.View):
|
class SlaughterView(disnake.ui.View):
|
||||||
@@ -248,7 +261,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Оставить", style=disnake.ButtonStyle.success, emoji="<:A_risworld_rislove:759009763840622622>")
|
@disnake.ui.button(label="Оставить", style=disnake.ButtonStyle.success, emoji="<:A_risworld_rislove:759009763840622622>")
|
||||||
async def button1_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def button1_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Вы не можете выбирать за другого игрока")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете выбирать за другого игрока")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.stop()
|
self.stop()
|
||||||
await self.on_timeout()
|
await self.on_timeout()
|
||||||
@@ -256,7 +270,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Забить", style=disnake.ButtonStyle.danger, emoji="<:A_risworld_risantilove:760082727356727297>")
|
@disnake.ui.button(label="Забить", style=disnake.ButtonStyle.danger, emoji="<:A_risworld_risantilove:760082727356727297>")
|
||||||
async def button2_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def button2_callback(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Вы не можете выбирать за другого игрока")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете выбирать за другого игрока")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await ctx.edit_original_message(view=None)
|
await ctx.edit_original_message(view=None)
|
||||||
self.stop()
|
self.stop()
|
||||||
@@ -270,7 +285,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
new_animal = (await session.execute(stmt)).scalars().first()
|
new_animal = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if new_animal is None:
|
if new_animal is None:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка операции", ephemeral = True).out(d=f"Животное не найдено")
|
err_embed = self.client.ErrEmbed(title = "Ошибка операции", description = f"Животное не найдено")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral = True)
|
||||||
await self.on_timeout()
|
await self.on_timeout()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -290,7 +306,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
await session.delete(new_animal)
|
await session.delete(new_animal)
|
||||||
user.rimagochi_account.items = items
|
user.rimagochi_account.items = items
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"~~{rarity['emoji']} {animal['name'].capitalize()} ({(chance*100):.02f}%)~~", description=",\n".join(f"{i} - {receiveditems[i]}" for i in receiveditems.keys()), colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"~~{rarity['emoji']} {animal['name'].capitalize()} ({(chance*100):.02f}%)~~", description=",\n".join(f"{i} - {receiveditems[i]}" for i in receiveditems.keys()), colour=0x2F3136)
|
||||||
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/a/ad/Мясо.png/revision/latest?cb=20190130152311&path-prefix=ru")
|
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/a/ad/Мясо.png/revision/latest?cb=20190130152311&path-prefix=ru")
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
|
|
||||||
@@ -321,10 +337,10 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка продажи")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка продажи")
|
||||||
|
|
||||||
if not (str(item) in user.rimagochi_account.items.keys() and user.rimagochi_account.items[str(item)] >= num):
|
if not (str(item) in user.rimagochi_account.items.keys() and user.rimagochi_account.items[str(item)] >= num):
|
||||||
await error_helper.out(d=f"У вас недостаточно {rimagochi_items[item]['name']}")
|
await err_embed.send(f"У вас недостаточно {rimagochi_items[item]['name']}")
|
||||||
return
|
return
|
||||||
items = copy.deepcopy(user.rimagochi_account.items)
|
items = copy.deepcopy(user.rimagochi_account.items)
|
||||||
items[str(item)] -= num
|
items[str(item)] -= num
|
||||||
@@ -333,7 +349,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = num * rimagochi_items[item]["sell_cost"], description = f"Продажа {rimagochi_items[item]['name']}({num} шт)")
|
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(recipient_id = ctx.author.id, amount = num * rimagochi_items[item]["sell_cost"], description = f"Продажа {rimagochi_items[item]['name']}({num} шт)")
|
||||||
session.add(history_write)
|
session.add(history_write)
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"{rimagochi_items[item]['name'].capitalize()}(x{num}) продано! Вы получили {num * rimagochi_items[item]['sell_cost']} крошек", description=f"", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{rimagochi_items[item]['name'].capitalize()}(x{num}) продано! Вы получили {num * rimagochi_items[item]['sell_cost']} крошек", description=f"", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=ctx.author.avatar)
|
embed.set_thumbnail(url=ctx.author.avatar)
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
|
|
||||||
@@ -351,9 +367,9 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@ShopSlash.sub_command(name="генов", description="Купите гены, чтобы улучшить ваших зверей! Информация о генах: \"/информация гены\"")
|
@ShopSlash.sub_command(name="генов", description="Купите гены, чтобы улучшить ваших зверей! Информация о генах: \"/информация гены\"")
|
||||||
async def GenesShopSub(self, ctx: disnake.AppCmdInter,
|
async def GenesShopSub(self, ctx: disnake.AppCmdInter,
|
||||||
gene: int = commands.Param(description="Какой ген желаете приобрести?", name="ген",
|
gene_id: int = commands.Param(description="Какой ген желаете приобрести?", name="ген",
|
||||||
choices=[disnake.OptionChoice(name=f"{i['name']} - {i['cost']} крошек", value=i['id']) for i in rimagochi_genes.values()])):
|
choices=[disnake.OptionChoice(name=f"{i['name']} - {i['cost']} крошек", value=i['id']) for i in rimagochi_genes.values()])):
|
||||||
gene = rimagochi_genes[gene]
|
gene = rimagochi_genes[gene_id]
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
await self.client.RimagochiUserUpdate(member = ctx.author, session = session)
|
await self.client.RimagochiUserUpdate(member = ctx.author, session = session)
|
||||||
@@ -366,8 +382,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.rimagochi_account.settings['hide_the_animals'])
|
||||||
|
|
||||||
if user.crumbs < gene['cost']:
|
if user.crumbs < gene['cost']:
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка покупки гена")
|
err_embed = self.client.ErrEmbed(title = "Ошибка покупки гена", description = f"Для покупки этого гена необходимо иметь {gene['cost']} крошек")
|
||||||
await error_helper.out(d=f"Для покупки этого гена необходимо иметь {gene['cost']} крошек")
|
await ctx.edit_original_message(err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
genes = copy.deepcopy(user.rimagochi_account.genes)
|
genes = copy.deepcopy(user.rimagochi_account.genes)
|
||||||
@@ -380,7 +396,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = gene['cost'], description = f"Покупка гена \"{gene['name']}\"")
|
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = gene['cost'], description = f"Покупка гена \"{gene['name']}\"")
|
||||||
session.add(history_write)
|
session.add(history_write)
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Ген \"{gene['name']}\" успешно приобретён!", description=f"Описание:\n{gene['description']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Ген \"{gene['name']}\" успешно приобретён!", description=f"Описание:\n{gene['description']}", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/f/fc/GeneBackground_Xenogene.png/revision/latest?cb=20221216070153&path-prefix=ru")
|
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/f/fc/GeneBackground_Xenogene.png/revision/latest?cb=20221216070153&path-prefix=ru")
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
|
|
||||||
@@ -452,7 +468,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
if crumbs_amout!=0:
|
if crumbs_amout!=0:
|
||||||
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = crumbs_amout, description = f"Корм для " + ", ".join(feeded_animals))
|
history_write = self.DataBaseManager.models['transaction_history_crumbs'].m(sender_id = ctx.author.id, amount = crumbs_amout, description = f"Корм для " + ", ".join(feeded_animals))
|
||||||
session.add(history_write)
|
session.add(history_write)
|
||||||
embed = disnake.Embed(title=f"Всего удалось потратить {crumbs_amout:.0f} крошек на {len(feeded_animals)} животных.", description="", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Всего удалось потратить {crumbs_amout:.0f} крошек на {len(feeded_animals)} животных.", description="", colour=0x2F3136)
|
||||||
stmt = self.DataBaseManager.select(self.DataBaseManager.models['rimagochi_users'].m.settings).where(self.DataBaseManager.models['rimagochi_users'].m.id == ctx.author.id)
|
stmt = self.DataBaseManager.select(self.DataBaseManager.models['rimagochi_users'].m.settings).where(self.DataBaseManager.models['rimagochi_users'].m.id == ctx.author.id)
|
||||||
settings = (await session.execute(stmt)).scalars().first()
|
settings = (await session.execute(stmt)).scalars().first()
|
||||||
if not settings['hide_the_animals']: embed.description = f"Покормлены:\n"+",\n".join(feeded_animals)
|
if not settings['hide_the_animals']: embed.description = f"Покормлены:\n"+",\n".join(feeded_animals)
|
||||||
@@ -483,13 +499,19 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
async with session.begin():
|
async with session.begin():
|
||||||
user = await session.get(self.DataBaseManager.models['rimagochi_users'].m, member.id)
|
user = await session.get(self.DataBaseManager.models['rimagochi_users'].m, member.id)
|
||||||
|
|
||||||
if user.settings['hide_the_animals'] and member != ctx.author and (not self.client.me in ctx.author.roles):
|
err_embed = self.client.ErrEmbed(err_func = ctx.response.send_message, title = "Ошибка инвентаря", description = f"Пользователь {member.mention} скрыл свой инвентарь")
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.response.send_message, err_name = "Ошибка инвентаря", thumbnail = member.avatar)
|
if isinstance(ctx.author, disnake.Member):
|
||||||
await error_helper.out(d=f"Пользователь {member.mention} скрыл свой инвентарь")
|
if user.settings['hide_the_animals'] and member != ctx.author and (not self.client.me in ctx.author.roles):
|
||||||
return
|
await err_embed.send()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if user.settings['hide_the_animals'] and member != ctx.author:
|
||||||
|
await err_embed.send()
|
||||||
|
return
|
||||||
|
|
||||||
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"", description=f"### Инвентарь {member.mention}\n", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"### Инвентарь {member.mention}\n", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=member.avatar)
|
embed.set_thumbnail(url=member.avatar)
|
||||||
|
|
||||||
if len([i for i in user.items.keys() if user.items[i]>0]) > 0:
|
if len([i for i in user.items.keys() if user.items[i]>0]) > 0:
|
||||||
@@ -528,14 +550,14 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
user.animals.sort(key=lambda animal: animal.creation_time, reverse=True)
|
user.animals.sort(key=lambda animal: animal.creation_time, reverse=True)
|
||||||
|
|
||||||
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
await ctx.response.defer(ephemeral = user.settings['hide_the_animals'])
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка профиля", thumbnail = member.avatar)
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка профиля", thumbnail = member.avatar)
|
||||||
|
|
||||||
if user.settings['hide_the_animals'] and member != ctx.author and (not self.client.me in ctx.author.roles):
|
if user.settings['hide_the_animals'] and member != ctx.author and (isinstance(ctx.author, disnake.User) or not self.client.me in ctx.author.roles):
|
||||||
await error_helper.out(d=f"Пользователь {member.mention} скрыл свой профиль")
|
await err_embed.send(f"Пользователь {member.mention} скрыл свой профиль")
|
||||||
return
|
return
|
||||||
|
|
||||||
if len(user.animals) == 0:
|
if len(user.animals) == 0:
|
||||||
await error_helper.out(d=f"Кажется, тут зверей пока нет")
|
await err_embed.send(f"Кажется, тут зверей пока нет")
|
||||||
return
|
return
|
||||||
|
|
||||||
async def AnimalsEmbeder(num: int, review = False):
|
async def AnimalsEmbeder(num: int, review = False):
|
||||||
@@ -543,7 +565,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
animal_data = user.animals[num-1]
|
animal_data = user.animals[num-1]
|
||||||
animal = rimagochi_animals[animal_data.model_animal_id]
|
animal = rimagochi_animals[animal_data.model_animal_id]
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Инвентарь {member.name}", description=f"\n### {animal['params']['rarity']['emoji']} {animal['name'].capitalize()}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Инвентарь {member.name}", description=f"\n### {animal['params']['rarity']['emoji']} {animal['name'].capitalize()}", colour=0x2F3136)
|
||||||
embed.set_footer(text = f"id: {animal_data.id}")
|
embed.set_footer(text = f"id: {animal_data.id}")
|
||||||
embed.set_thumbnail(url=animal['params']['image_url'])
|
embed.set_thumbnail(url=animal['params']['image_url'])
|
||||||
animal = copy.deepcopy(animal)
|
animal = copy.deepcopy(animal)
|
||||||
@@ -604,7 +626,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
return animal, animal_data, user.settings
|
return animal, animal_data, user.settings
|
||||||
|
|
||||||
async def feed_animal(inter, animal, animal_id, food = None):
|
async def feed_animal(inter, animal, animal_id, food = None):
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка инвентаря", ephemeral=True)
|
err_embed = self.client.ErrEmbed(err_func = inter.response.send_message, err_func_kwargs = {'ephemeral': True}, title = "Ошибка инвентаря")
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
stmt = self.DataBaseManager.select(rimagochi_users_model).options(
|
stmt = self.DataBaseManager.select(rimagochi_users_model).options(
|
||||||
@@ -618,11 +640,11 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
animal = copy.deepcopy(animal)
|
animal = copy.deepcopy(animal)
|
||||||
|
|
||||||
if animal_data.feed_today_count >= 4 and (now() - animal_data.first_today_feed_time) < (24 * 60 * 60):
|
if animal_data.feed_today_count >= 4 and (now() - animal_data.first_today_feed_time) < (24 * 60 * 60):
|
||||||
await error_helper.out(d=f"Вы уже покормили своего зверя 4 раза за сегодня, обновление лимитов будет <t:{int(animal_data.first_today_feed_time + (24 * 60 * 60))}:R>")
|
await err_embed.send(f"Вы уже покормили своего зверя 4 раза за сегодня, обновление лимитов будет <t:{int(animal_data.first_today_feed_time + (24 * 60 * 60))}:R>")
|
||||||
return
|
return
|
||||||
|
|
||||||
if (now() - animal_data.last_feeding_time) < (3 * 60 * 60):
|
if (now() - animal_data.last_feeding_time) < (3 * 60 * 60):
|
||||||
await error_helper.out(d=f"Следующий раз можно покормить <t:{int(animal_data.last_feeding_time + (3 * 60 * 60))}:R>")
|
await err_embed.send(f"Следующий раз можно покормить <t:{int(animal_data.last_feeding_time + (3 * 60 * 60))}:R>")
|
||||||
return
|
return
|
||||||
|
|
||||||
genes = []
|
genes = []
|
||||||
@@ -638,14 +660,14 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
if food:
|
if food:
|
||||||
items = copy.deepcopy(rimagochi_user.items)
|
items = copy.deepcopy(rimagochi_user.items)
|
||||||
if (not str(food['id']) in items.keys()) or items[str(food['id'])] < hunger / 10:
|
if (not str(food['id']) in items.keys()) or items[str(food['id'])] < hunger / 10:
|
||||||
await error_helper.out(d=f"У вас недостаточно {food['name']}")
|
await err_embed.send(f"У вас недостаточно {food['name']}")
|
||||||
return
|
return
|
||||||
|
|
||||||
items[str(food['id'])] = items[str(food['id'])] - hunger / 10
|
items[str(food['id'])] = items[str(food['id'])] - hunger / 10
|
||||||
rimagochi_user.items = items
|
rimagochi_user.items = items
|
||||||
else:
|
else:
|
||||||
if rimagochi_user.user.crumbs < hunger:
|
if rimagochi_user.user.crumbs < hunger:
|
||||||
await error_helper.out(d=f"У вас недостаточно крошек")
|
await err_embed.send(f"У вас недостаточно крошек")
|
||||||
return
|
return
|
||||||
|
|
||||||
rimagochi_user.user.crumbs -= hunger
|
rimagochi_user.user.crumbs -= hunger
|
||||||
@@ -661,7 +683,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
animal_data.last_feeding_time = now()
|
animal_data.last_feeding_time = now()
|
||||||
animal_data.experience, animal_data.level, remains = self.client.AnimalLevelAdder(animal_data.experience+100, animal_data.level)
|
animal_data.experience, animal_data.level, remains = self.client.AnimalLevelAdder(animal_data.experience+100, animal_data.level)
|
||||||
|
|
||||||
embed = disnake.Embed(description=f"{animal['name'].capitalize()} покормлен, до следующего уровня ему осталось всего {remains} опыта", title=f"", colour=0x2F3136)
|
embed = self.client.InfoEmbed(description=f"{animal['name'].capitalize()} покормлен, до следующего уровня ему осталось всего {remains} опыта", title=f"", colour=0x2F3136)
|
||||||
await inter.response.send_message(embed = embed, ephemeral=True)
|
await inter.response.send_message(embed = embed, ephemeral=True)
|
||||||
|
|
||||||
nonlocal user
|
nonlocal user
|
||||||
@@ -714,7 +736,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Покормить", style=disnake.ButtonStyle.success, row=1)
|
@disnake.ui.button(label="Покормить", style=disnake.ButtonStyle.success, row=1)
|
||||||
async def feed_modal(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def feed_modal(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if member != inter.author:
|
if member != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Нельзя кормить чужих животных!!!")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Нельзя кормить чужих животных!!!")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
if len(self.animal["params"]["can_eate"])==0 or self.settings['always_use_crumbs_for_feeding']:
|
if len(self.animal["params"]["can_eate"])==0 or self.settings['always_use_crumbs_for_feeding']:
|
||||||
await feed_animal(inter, self.animal, self.animal_data.id)
|
await feed_animal(inter, self.animal, self.animal_data.id)
|
||||||
@@ -728,7 +751,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Забить", style=disnake.ButtonStyle.danger, row=1)
|
@disnake.ui.button(label="Забить", style=disnake.ButtonStyle.danger, row=1)
|
||||||
async def kill_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def kill_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if member != inter.author:
|
if member != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Нельзя убивать чужих животных!!!")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Нельзя убивать чужих животных!!!")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.stop()
|
self.stop()
|
||||||
@@ -741,16 +765,17 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
super().__init__(timeout = 60)
|
super().__init__(timeout = 60)
|
||||||
self.add_item(disnake.ui.Button(label="Забить!!!", style=disnake.ButtonStyle.danger, custom_id="accept"))
|
self.add_item(disnake.ui.Button(label="Забить!!!", style=disnake.ButtonStyle.danger, custom_id="accept"))
|
||||||
self.add_item(disnake.ui.Button(label="Нет, отменяй", style=disnake.ButtonStyle.success, custom_id="reject"))
|
self.add_item(disnake.ui.Button(label="Нет, отменяй", style=disnake.ButtonStyle.success, custom_id="reject"))
|
||||||
async def interaction_check(self, inter):
|
async def interaction_check(self, interaction):
|
||||||
if member != inter.author:
|
if member != interaction.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Нельзя убивать чужих животных!!!")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Нельзя убивать чужих животных!!!")
|
||||||
return
|
await interaction.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
if inter.data.custom_id == "accept":
|
return True
|
||||||
|
if interaction.data.custom_id == "accept":
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
animal = await session.get(rimagochi_animals_model, self.animal_data.id, with_for_update = True)
|
animal = await session.get(rimagochi_animals_model, self.animal_data.id, with_for_update = True)
|
||||||
if animal is None:
|
if animal is None:
|
||||||
return
|
return True
|
||||||
await session.delete(animal)
|
await session.delete(animal)
|
||||||
|
|
||||||
user = await session.get(rimagochi_users_model, member.id, with_for_update = True)
|
user = await session.get(rimagochi_users_model, member.id, with_for_update = True)
|
||||||
@@ -764,27 +789,29 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
items[str(item['item']['id'])] += receive
|
items[str(item['item']['id'])] += receive
|
||||||
user.items = items
|
user.items = items
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"~~{self.animal['name'].capitalize()}~~", description=",\n".join(f"{i} - {receiveditems[i]}" for i in receiveditems.keys()), colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"~~{self.animal['name'].capitalize()}~~", description=",\n".join(f"{i} - {receiveditems[i]}" for i in receiveditems.keys()), colour=0x2F3136)
|
||||||
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/a/ad/Мясо.png/revision/latest?cb=20190130152311&path-prefix=ru")
|
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/a/ad/Мясо.png/revision/latest?cb=20190130152311&path-prefix=ru")
|
||||||
await ctx.edit_original_message(embed=embed, view=None)
|
await ctx.edit_original_message(embed=embed, view=None)
|
||||||
|
|
||||||
if inter.data.custom_id == "reject":
|
if interaction.data.custom_id == "reject":
|
||||||
await inter.response.defer()
|
await interaction.response.defer()
|
||||||
embed = disnake.Embed(title=f"", description=f"В этот раз {self.animal['name']} остался в живых", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"В этот раз {self.animal['name']} остался в живых", colour=0x2F3136)
|
||||||
await ctx.edit_original_message(embed=embed, view=None)
|
await ctx.edit_original_message(embed=embed, view=None)
|
||||||
|
|
||||||
self.stop()
|
self.stop()
|
||||||
|
return False
|
||||||
async def on_timeout(self):
|
async def on_timeout(self):
|
||||||
embed = disnake.Embed(title=f"Выбор не сделан", description=f"В этот раз {self.animal['name']} остался в живых", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Выбор не сделан", description=f"В этот раз {self.animal['name']} остался в живых", colour=0x2F3136)
|
||||||
await ctx.edit_original_message(embed=embed, view=None)
|
await ctx.edit_original_message(embed=embed, view=None)
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Вы вменяемы?", description=f"{self.animal['name']} умрёт и вы потеряете все гены и опыт с него!!!", colour=0x2F3136)
|
embed = self.client.WarnEmbed(title=f"Вы вменяемы?", description=f"{self.animal['name']} умрёт и вы потеряете все гены и опыт с него!!!", colour=0x2F3136)
|
||||||
await ctx.edit_original_message(embed=embed, view=MixedView())
|
await ctx.edit_original_message(embed=embed, view=MixedView())
|
||||||
|
|
||||||
@disnake.ui.button(label = ".", style=disnake.ButtonStyle.primary, row=1)
|
@disnake.ui.button(label = ".", style=disnake.ButtonStyle.primary, row=1)
|
||||||
async def battle_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def battle_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if member != inter.author:
|
if member != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Вы не можете управлять чужим отрядом")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете управлять чужим отрядом")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
@@ -805,7 +832,7 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
if busy_battle_slots + self.animal['params']['required_slots'] > rimagochi_constants['max_battle_slots']:
|
if busy_battle_slots + self.animal['params']['required_slots'] > rimagochi_constants['max_battle_slots']:
|
||||||
embed = disnake.Embed(title=f"у вас нет столько свободного места в отряде!!!", description=f"", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"у вас нет столько свободного места в отряде!!!", description=f"", colour=0x2F3136)
|
||||||
await inter.response.send_message(embed=embed, ephemeral=True)
|
await inter.response.send_message(embed=embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
animal_data.in_battle_slots = True
|
animal_data.in_battle_slots = True
|
||||||
@@ -827,7 +854,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Применить ген", style=disnake.ButtonStyle.primary, row=1)
|
@disnake.ui.button(label="Применить ген", style=disnake.ButtonStyle.primary, row=1)
|
||||||
async def apply_genes_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def apply_genes_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if member != inter.author:
|
if member != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Вы не можете управлять чужим отрядом")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете управлять чужим отрядом")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
class ApplyGenesView(disnake.ui.View):
|
class ApplyGenesView(disnake.ui.View):
|
||||||
client = self.client
|
client = self.client
|
||||||
@@ -844,8 +872,11 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
))
|
))
|
||||||
async def interaction_check(self, interaction: disnake.MessageInteraction):
|
async def interaction_check(self, interaction: disnake.MessageInteraction):
|
||||||
if member != inter.author:
|
if member != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Вы не можете управлять чужим отрядом")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете управлять чужим отрядом")
|
||||||
return
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
|
return True
|
||||||
|
if interaction.data.values is None:
|
||||||
|
raise ValueError("rimagochi.py: interaction.data.values None type")
|
||||||
selected_value = interaction.data.values[0]
|
selected_value = interaction.data.values[0]
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
@@ -856,8 +887,9 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
suitable_genes = [i for i in rimagochi_user.genes.keys() if (not int(i) in animal_data.genes) and rimagochi_user.genes[i] > 0]
|
suitable_genes = [i for i in rimagochi_user.genes.keys() if (not int(i) in animal_data.genes) and rimagochi_user.genes[i] > 0]
|
||||||
|
|
||||||
if not selected_value in suitable_genes:
|
if not selected_value in suitable_genes:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка применения генов", d="У вас больше нет этого гена или ген уже был применён")
|
err_embed = self.client.ErrEmbed(title = "Ошибка применения генов", description = "У вас больше нет этого гена или ген уже был применён")
|
||||||
return
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
|
return True
|
||||||
|
|
||||||
animal_genes = copy.deepcopy(self.animal_data.genes)
|
animal_genes = copy.deepcopy(self.animal_data.genes)
|
||||||
animal_genes.append(int(selected_value))
|
animal_genes.append(int(selected_value))
|
||||||
@@ -869,12 +901,14 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
suitable_genes.remove(selected_value)
|
suitable_genes.remove(selected_value)
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"", description=f"В животное `{self.animal['name']}` успешно вставлен ген {rimagochi_genes[int(selected_value)]['name']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"В животное `{self.animal['name']}` успешно вставлен ген {rimagochi_genes[int(selected_value)]['name']}", colour=0x2F3136)
|
||||||
await interaction.response.send_message(embed = embed, ephemeral=True)
|
await interaction.response.send_message(embed = embed, ephemeral=True)
|
||||||
if len(suitable_genes) != 0:
|
if len(suitable_genes) != 0:
|
||||||
await ctx.edit_original_message(view=ApplyGenesView(suitable_genes))
|
await ctx.edit_original_message(view=ApplyGenesView(suitable_genes))
|
||||||
else:
|
else:
|
||||||
await ctx.edit_original_message(view=None)
|
await ctx.edit_original_message(view=None)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
async def on_timeout(self):
|
async def on_timeout(self):
|
||||||
await ctx.edit_original_message(view=None)
|
await ctx.edit_original_message(view=None)
|
||||||
@@ -887,18 +921,20 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
suitable_genes = [i for i in rimagochi_user.genes.keys() if (not int(i) in animal_data.genes) and rimagochi_user.genes[i] > 0]
|
suitable_genes = [i for i in rimagochi_user.genes.keys() if (not int(i) in animal_data.genes) and rimagochi_user.genes[i] > 0]
|
||||||
|
|
||||||
if len(suitable_genes) == 0:
|
if len(suitable_genes) == 0:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка применения генов", d=f"У вас пока нет генов, которые можно применить на {self.animal['name']}")
|
err_embed = self.client.ErrEmbed(title = "Ошибка применения генов", description = f"У вас пока нет генов, которые можно применить на {self.animal['name']}")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.stop()
|
self.stop()
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
embed = disnake.Embed(title=f"Какие гены хотите применить на животное {self.animal['name']}?", description=f"Будьте внимательны, вернуть использованные генопаки уже не выйдет", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Какие гены хотите применить на животное {self.animal['name']}?", description=f"Будьте внимательны, вернуть использованные генопаки уже не выйдет", colour=0x2F3136)
|
||||||
await ctx.edit_original_message(embed=embed, view=ApplyGenesView(suitable_genes))
|
await ctx.edit_original_message(embed=embed, view=ApplyGenesView(suitable_genes))
|
||||||
|
|
||||||
@disnake.ui.button(label="<", style=disnake.ButtonStyle.secondary, row=2)
|
@disnake.ui.button(label="<", style=disnake.ButtonStyle.secondary, row=2)
|
||||||
async def backward_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def backward_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Вы не можете управлять чужим инвентарём")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете управлять чужим инвентарём")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.page = max(self.page-1, 1)
|
self.page = max(self.page-1, 1)
|
||||||
@@ -909,7 +945,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label=">", style=disnake.ButtonStyle.secondary, row=2)
|
@disnake.ui.button(label=">", style=disnake.ButtonStyle.secondary, row=2)
|
||||||
async def forward_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def forward_button(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if ctx.author != inter.author:
|
if ctx.author != inter.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, ephemeral=True).out(n="Ошибка доступа", d=f"Вы не можете управлять чужим инвентарём")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Вы не можете управлять чужим инвентарём")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral=True)
|
||||||
return
|
return
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
self.page = min(self.page+1, self.max_page)
|
self.page = min(self.page+1, self.max_page)
|
||||||
@@ -949,9 +986,10 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
name="ставка"),
|
name="ставка"),
|
||||||
member: disnake.Member = commands.Param(description="Кому хотите бросить вызов?",
|
member: disnake.Member = commands.Param(description="Кому хотите бросить вызов?",
|
||||||
name="игрок", default=None)):
|
name="игрок", default=None)):
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.response.send_message, err_name = "Ошибка вызова", ephemeral = True)
|
|
||||||
|
err_embed = self.client.ErrEmbed(err_func = ctx.response.send_message, err_func_kwargs = {'ephemeral': True}, title = "Ошибка вызова")
|
||||||
if ctx.author == member:
|
if ctx.author == member:
|
||||||
await error_helper.out(d=f"Нельзя бросить вызов самому себе")
|
await err_embed.send(f"Нельзя бросить вызов самому себе")
|
||||||
return
|
return
|
||||||
|
|
||||||
rimagochi_users_model = self.DataBaseManager.models['rimagochi_users'].m
|
rimagochi_users_model = self.DataBaseManager.models['rimagochi_users'].m
|
||||||
@@ -965,15 +1003,15 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
author_user = (await session.execute(stmt)).scalars().first()
|
author_user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if author_user.user.crumbs < bet:
|
if author_user.user.crumbs < bet:
|
||||||
await error_helper.out(d=f"Вам не хватает крошек на такую ставку")
|
await err_embed.send(f"Вам не хватает крошек на такую ставку")
|
||||||
return
|
return
|
||||||
|
|
||||||
if len(author_user.battle_slots_animals)==0:
|
if len(author_user.battle_slots_animals)==0:
|
||||||
await error_helper.out(d=f"У вас нет экипированных зверей")
|
await err_embed.send(f"У вас нет экипированных зверей")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not author_user.settings['accept_the_challenge']:
|
if not author_user.settings['accept_the_challenge']:
|
||||||
await error_helper.out(d=f"Чтобы бросить вызов, у вас должна быть включена настройка 'получать вызовы'")
|
await err_embed.send(f"Чтобы бросить вызов, у вас должна быть включена настройка 'получать вызовы'")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not member is None:
|
if not member is None:
|
||||||
@@ -984,19 +1022,19 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
member_user = (await session.execute(stmt)).scalars().first()
|
member_user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if member_user is None:
|
if member_user is None:
|
||||||
await error_helper.out(d=f"У этого пользователя пока нет профиля")
|
await err_embed.send(f"У этого пользователя пока нет профиля")
|
||||||
return
|
return
|
||||||
|
|
||||||
if member_user.user.crumbs < bet:
|
if member_user.user.crumbs < bet:
|
||||||
await error_helper.out(d=f"Вашему оппоненту не хватает крошек на такую ставку")
|
await err_embed.send(f"Вашему оппоненту не хватает крошек на такую ставку")
|
||||||
return
|
return
|
||||||
|
|
||||||
if len(member_user.battle_slots_animals)==0:
|
if len(member_user.battle_slots_animals)==0:
|
||||||
await error_helper.out(d=f"У вашего оппонента нет экипированных зверей")
|
await err_embed.send(f"У вашего оппонента нет экипированных зверей")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not member_user.settings['accept_the_challenge']:
|
if not member_user.settings['accept_the_challenge']:
|
||||||
await error_helper.out(d=f"Этот пользователь не принимает вызовы")
|
await err_embed.send(f"Этот пользователь не принимает вызовы")
|
||||||
return
|
return
|
||||||
|
|
||||||
class ButtonsView(disnake.ui.View):
|
class ButtonsView(disnake.ui.View):
|
||||||
@@ -1011,13 +1049,14 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@disnake.ui.button(label="Принять вызов", style=disnake.ButtonStyle.success, row=1)
|
@disnake.ui.button(label="Принять вызов", style=disnake.ButtonStyle.success, row=1)
|
||||||
async def take_challenge(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def take_challenge(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка", ephemeral = True)
|
|
||||||
|
err_embed = self.client.ErrEmbed(err_func = inter.response.send_message, err_func_kwargs = {'ephemeral': True}, title = "Ошибка вызова")
|
||||||
if self.member:
|
if self.member:
|
||||||
if self.member != inter.author:
|
if self.member != inter.author:
|
||||||
await error_helper.out(d=f"Этот вызов был брошен не вам, к сожалению, вы не сможете его принять")
|
await err_embed.send(f"Этот вызов был брошен не вам, к сожалению, вы не сможете его принять")
|
||||||
return
|
return
|
||||||
elif inter.author == self.author:
|
elif inter.author == self.author:
|
||||||
await error_helper.out(d=f"Вы не можете принять свой же вызов!!!")
|
await err_embed.send(f"Вы не можете принять свой же вызов!!!")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.member = inter.author
|
self.member = inter.author
|
||||||
@@ -1037,26 +1076,27 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
member_user = (await session.execute(stmt)).scalars().first()
|
member_user = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if member_user is None:
|
if member_user is None:
|
||||||
await error_helper.out(d=f"У вас пока нет профиля, напишите хотя бы одно сообщение")
|
await err_embed.send(f"У вас пока нет профиля, напишите хотя бы одно сообщение")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not member_user.settings['accept_the_challenge']:
|
if not member_user.settings['accept_the_challenge']:
|
||||||
await error_helper.out(d=f"Чтобы принять вызов, у вас должна быть включена настройка 'получать вызовы'")
|
await err_embed.send(f"Чтобы принять вызов, у вас должна быть включена настройка 'получать вызовы'")
|
||||||
return
|
return
|
||||||
|
|
||||||
if member_user.user.crumbs < self.bet:
|
if member_user.user.crumbs < self.bet:
|
||||||
await error_helper.out(d=f"Вам не хватает крошек, чтобы принять этот вызов")
|
await err_embed.send(f"Вам не хватает крошек, чтобы принять этот вызов")
|
||||||
return
|
return
|
||||||
|
|
||||||
if len([animal for animal in member_user.animals if animal.in_battle_slots]) == 0:
|
if len([animal for animal in member_user.animals if animal.in_battle_slots]) == 0:
|
||||||
await error_helper.out(d=f"У вас нет экипированных зверей")
|
await err_embed.send(f"У вас нет экипированных зверей")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.stop()
|
self.stop()
|
||||||
await ctx.edit_original_message("", view = None)
|
await ctx.edit_original_message("", view = None)
|
||||||
|
|
||||||
if author_user.user.crumbs < self.bet:
|
if author_user.user.crumbs < self.bet:
|
||||||
await self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка").out(d=f"{self.author.mention} не хватает крошек на ставку, бой отменяется")
|
err_embed = self.client.ErrEmbed(title = err_embed.title, description = f"{self.author.mention} не хватает крошек на ставку, бой отменяется")
|
||||||
|
await ctx.edit_original_message(embed=err_embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
players_list = [self.author, self.member]
|
players_list = [self.author, self.member]
|
||||||
@@ -1083,11 +1123,11 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
|
|
||||||
for i in range(10, 0, -1):
|
for i in range(10, 0, -1):
|
||||||
embed = disnake.Embed(title=f"", description=f"### Вызов принят {self.member.mention}\nИдёт подсчёт сил и рассчёт победителя...\n-# Результат будет через {i} секунд", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"### Вызов принят {self.member.mention}\nИдёт подсчёт сил и рассчёт победителя...\n-# Результат будет через {i} секунд", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url="https://media.discordapp.net/attachments/887735863734313000/1357768401195634728/confused-cat-confused.gif?ex=67f167dc&is=67f0165c&hm=bebc160fac83107c143b93c825b926cbf83caf9d5eb56535c4c11ada09e57103&=")
|
embed.set_thumbnail(url="https://media.discordapp.net/attachments/887735863734313000/1357768401195634728/confused-cat-confused.gif?ex=67f167dc&is=67f0165c&hm=bebc160fac83107c143b93c825b926cbf83caf9d5eb56535c4c11ada09e57103&=")
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
embed = disnake.Embed(title=f"", description=f"### Победил {players_list[chosen_player].mention}!\n\nИздалека все могли видеть сражающихся животных:\n"
|
embed = self.client.InfoEmbed(title=f"", description=f"### Победил {players_list[chosen_player].mention}!\n\nИздалека все могли видеть сражающихся животных:\n"
|
||||||
f"На стороне {self.author.mention}: {', '.join(rimagochi_animals[animal.model_animal_id]['name'] for animal in author_user.animals if animal.in_battle_slots)}\n"
|
f"На стороне {self.author.mention}: {', '.join(rimagochi_animals[animal.model_animal_id]['name'] for animal in author_user.animals if animal.in_battle_slots)}\n"
|
||||||
f"На стороне {self.member.mention}: {', '.join(rimagochi_animals[animal.model_animal_id]['name'] for animal in member_user.animals if animal.in_battle_slots)}", colour=0x2F3136)
|
f"На стороне {self.member.mention}: {', '.join(rimagochi_animals[animal.model_animal_id]['name'] for animal in member_user.animals if animal.in_battle_slots)}", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=players_list[chosen_player].avatar)
|
embed.set_thumbnail(url=players_list[chosen_player].avatar)
|
||||||
@@ -1096,19 +1136,20 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Отменить вызов", style=disnake.ButtonStyle.danger, row=1)
|
@disnake.ui.button(label="Отменить вызов", style=disnake.ButtonStyle.danger, row=1)
|
||||||
async def off_challenge(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
async def off_challenge(self, button: disnake.ui.Button, inter: disnake.MessageInteraction):
|
||||||
if inter.author != self.author:
|
if inter.author != self.author:
|
||||||
await self.client.ErrorOutHelper(send_function = inter.response.send_message, err_name = "Ошибка доступа", ephemeral = True).out(d=f"Отменить этот вызов может только {self.author.mention}")
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = f"Отменить этот вызов может только {self.author.mention}")
|
||||||
|
await inter.response.send_message(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
embed = disnake.Embed(title=f"", description=f"### {self.author.mention} отменил вызов на бой", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"### {self.author.mention} отменил вызов на бой", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=self.author.avatar)
|
embed.set_thumbnail(url=self.author.avatar)
|
||||||
self.stop()
|
self.stop()
|
||||||
await ctx.edit_original_message("", embed = embed, view = None)
|
await ctx.edit_original_message("", embed = embed, view = None)
|
||||||
|
|
||||||
async def on_timeout(self):
|
async def on_timeout(self):
|
||||||
embed = disnake.Embed(title=f"", description=f"\n### Вызов от {ctx.author.mention}(просрочено)\nВы уже не можете принять вызов, нажав на кнопку ниже.\n-# Ставка `{bet}` крошек", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"\n### Вызов от {ctx.author.mention}(просрочено)\nВы уже не можете принять вызов, нажав на кнопку ниже.\n-# Ставка `{bet}` крошек", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=ctx.author.avatar)
|
embed.set_thumbnail(url=ctx.author.avatar)
|
||||||
await ctx.edit_original_message(embed=embed, view=None)
|
await ctx.edit_original_message(embed=embed, view=None)
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"", description=f"### Вызов от {ctx.author.mention}\nВы можете принять вызов, нажав на кнопку ниже!\n-# Ставка `{bet}` крошек", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"### Вызов от {ctx.author.mention}\nВы можете принять вызов, нажав на кнопку ниже!\n-# Ставка `{bet}` крошек", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url=ctx.author.avatar)
|
embed.set_thumbnail(url=ctx.author.avatar)
|
||||||
await ctx.response.send_message(f"{member.mention}" if member else None, embed=embed, view = ButtonsView(ctx.author, member, bet))
|
await ctx.response.send_message(f"{member.mention}" if member else None, embed=embed, view = ButtonsView(ctx.author, member, bet))
|
||||||
|
|
||||||
@@ -1124,7 +1165,8 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
async def InformationSubGroup(self, ctx: disnake.AppCmdInter):
|
async def InformationSubGroup(self, ctx: disnake.AppCmdInter):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def animal_autocomplete(inter: disnake.ApplicationCommandInteraction, user_input: str):
|
@staticmethod
|
||||||
|
async def animal_autocomplete(interaction: disnake.ApplicationCommandInteraction, user_input: str):
|
||||||
animals = [
|
animals = [
|
||||||
animal["name"]
|
animal["name"]
|
||||||
for animal in rimagochi_animals.values()
|
for animal in rimagochi_animals.values()
|
||||||
@@ -1134,41 +1176,42 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном животном", name="животные")
|
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном животном", name="животные")
|
||||||
async def RimagochiBestiarySub(self, ctx: disnake.AppCmdInter,
|
async def RimagochiBestiarySub(self, ctx: disnake.AppCmdInter,
|
||||||
animal: str = commands.Param(description="Название животного или его ID", name="животное",
|
animal_str: str = commands.Param(description="Название животного или его ID", name="животное",
|
||||||
autocomplete=animal_autocomplete)):
|
autocomplete=animal_autocomplete)):
|
||||||
matches = {}
|
matches = {}
|
||||||
animal = animal.lower()
|
animal_formated = animal_str.lower()
|
||||||
finded_flag = False
|
finded_flag = False
|
||||||
if animal.isnumeric() and int(animal) in rimagochi_animals.keys():
|
animal = {}
|
||||||
animal = rimagochi_animals[int(animal)]
|
if animal_formated.isnumeric() and int(animal_formated) in rimagochi_animals.keys():
|
||||||
|
animal = rimagochi_animals[int(animal_formated)]
|
||||||
finded_flag = True
|
finded_flag = True
|
||||||
else:
|
else:
|
||||||
for key, value in rimagochi_animals.items():
|
for key, value in rimagochi_animals.items():
|
||||||
if animal in value['name'].lower():
|
if animal_formated in value['name'].lower():
|
||||||
matches.setdefault(key, value['name'])
|
matches.setdefault(key, value['name'])
|
||||||
if animal == value['name'].lower():
|
if animal_formated == value['name'].lower():
|
||||||
animal = rimagochi_animals[key]
|
animal = rimagochi_animals[key]
|
||||||
finded_flag = True
|
finded_flag = True
|
||||||
break
|
break
|
||||||
if (not finded_flag) and (not matches):
|
if (not finded_flag) and (not matches):
|
||||||
for key, value in rimagochi_animals.items():
|
for key, value in rimagochi_animals.items():
|
||||||
if animal in value['description'].lower():
|
if animal_formated in value['description'].lower():
|
||||||
matches.setdefault(key, value['name'])
|
matches.setdefault(key, value['name'])
|
||||||
if len(matches)==1 and (not finded_flag):
|
if len(matches)==1 and (not finded_flag):
|
||||||
animal = rimagochi_animals[list(matches.keys())[0]]
|
animal = rimagochi_animals[list(matches.keys())[0]]
|
||||||
finded_flag = True
|
finded_flag = True
|
||||||
|
|
||||||
if not finded_flag and len(matches)==0:
|
if not finded_flag and len(matches)==0:
|
||||||
embed = disnake.Embed(title=f"", description=f"Мы искали как могли, но не смогли найти такого зверя", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"Мы искали как могли, но не смогли найти такого зверя", colour=0x2F3136)
|
||||||
await ctx.response.send_message(embed = embed)
|
await ctx.response.send_message(embed = embed)
|
||||||
return
|
return
|
||||||
elif not finded_flag:
|
elif not finded_flag:
|
||||||
embed = disnake.Embed(title=f"", description=f"Мы нашли много совпадений, но ничего конкретного, уточните запрос\n-# Найдено совпадений: {', '.join([i for i in matches.values()])}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f"Мы нашли много совпадений, но ничего конкретного, уточните запрос\n-# Найдено совпадений: {', '.join([i for i in matches.values()])}", colour=0x2F3136)
|
||||||
await ctx.response.send_message(embed = embed)
|
await ctx.response.send_message(embed = embed)
|
||||||
return
|
return
|
||||||
|
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
embed = disnake.Embed(title=f"{animal['name'].capitalize()}", description=f"{animal['description']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{animal['name'].capitalize()}", description=f"{animal['description']}", colour=0x2F3136)
|
||||||
embed.set_thumbnail(url = animal['params']['image_url'])
|
embed.set_thumbnail(url = animal['params']['image_url'])
|
||||||
embed.set_footer(text = f"id: {animal['id']}")
|
embed.set_footer(text = f"id: {animal['id']}")
|
||||||
embed.add_field(name=f"Редкость:",
|
embed.add_field(name=f"Редкость:",
|
||||||
@@ -1199,12 +1242,12 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном предмете", name="предметы")
|
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном предмете", name="предметы")
|
||||||
async def RimagochiItemsInfoSub(self, ctx: disnake.AppCmdInter,
|
async def RimagochiItemsInfoSub(self, ctx: disnake.AppCmdInter,
|
||||||
item: str = commands.Param(description="Название предмета",
|
item_id: str = commands.Param(description="Название предмета",
|
||||||
name="предмет",
|
name="предмет",
|
||||||
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_items.values()])):
|
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_items.values()])):
|
||||||
item = rimagochi_items[int(item)]
|
item = rimagochi_items[int(item_id)]
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
embed = disnake.Embed(title=f"{item['name'].capitalize()}", description=f"{item['description']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{item['name'].capitalize()}", description=f"{item['description']}", colour=0x2F3136)
|
||||||
embed.set_footer(text = f"id: {item['id']}")
|
embed.set_footer(text = f"id: {item['id']}")
|
||||||
embed.add_field(name=f"Основные характеристики".center(40, '-'),value=f"",inline=False)
|
embed.add_field(name=f"Основные характеристики".center(40, '-'),value=f"",inline=False)
|
||||||
embed.add_field(name=f"Стоимость при продаже:",
|
embed.add_field(name=f"Стоимость при продаже:",
|
||||||
@@ -1221,12 +1264,12 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном генопаке", name="генопаки")
|
@InformationSubGroup.sub_command(description="Показывает информацию о выбранном генопаке", name="генопаки")
|
||||||
async def RimagochiGenesInfoSub(self, ctx: disnake.AppCmdInter,
|
async def RimagochiGenesInfoSub(self, ctx: disnake.AppCmdInter,
|
||||||
gene: str = commands.Param(description="Название гена",
|
gene_id: str = commands.Param(description="Название гена",
|
||||||
name="ген",
|
name="ген",
|
||||||
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_genes.values()])):
|
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_genes.values()])):
|
||||||
gene = rimagochi_genes[int(gene)]
|
gene = rimagochi_genes[int(gene_id)]
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
embed = disnake.Embed(title=f"{gene['name'].capitalize()}", description=f"{gene['description']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{gene['name'].capitalize()}", description=f"{gene['description']}", colour=0x2F3136)
|
||||||
embed.set_footer(text = f"id: {gene['id']}")
|
embed.set_footer(text = f"id: {gene['id']}")
|
||||||
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/f/fc/GeneBackground_Xenogene.png/revision/latest?cb=20221216070153&path-prefix=ru")
|
embed.set_thumbnail(url = "https://static.wikia.nocookie.net/rimworld/images/f/fc/GeneBackground_Xenogene.png/revision/latest?cb=20221216070153&path-prefix=ru")
|
||||||
|
|
||||||
@@ -1234,12 +1277,12 @@ class MainRimagochiModule(commands.Cog):
|
|||||||
|
|
||||||
@InformationSubGroup.sub_command(description="Показывает информацию о выбранной капсуле криптосна", name="капсулы")
|
@InformationSubGroup.sub_command(description="Показывает информацию о выбранной капсуле криптосна", name="капсулы")
|
||||||
async def RimagochiCapsuleInfoSub(self, ctx: disnake.AppCmdInter,
|
async def RimagochiCapsuleInfoSub(self, ctx: disnake.AppCmdInter,
|
||||||
capsule: str = commands.Param(description="Название капсулы",
|
capsule_id: str = commands.Param(description="Название капсулы",
|
||||||
name="капсула",
|
name="капсула",
|
||||||
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_capsules.values()])):
|
choices=[disnake.OptionChoice(name=f"{i['name']}", value=str(i['id'])) for i in rimagochi_capsules.values()])):
|
||||||
capsule = rimagochi_capsules[int(capsule)]
|
capsule = rimagochi_capsules[int(capsule_id)]
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
embed = disnake.Embed(title=f"{capsule['name'].capitalize()}", description=f"Цена: {capsule['cost']}", colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"{capsule['name'].capitalize()}", description=f"Цена: {capsule['cost']}", colour=0x2F3136)
|
||||||
embed.set_footer(text = f"id: {capsule['id']}")
|
embed.set_footer(text = f"id: {capsule['id']}")
|
||||||
for i in capsule['chances']:
|
for i in capsule['chances']:
|
||||||
embed.add_field(name=f"",value=f"{i['rarity']['emoji']} {i['rarity']['name']} - {i['chance']*100:.02f}%",inline=False)
|
embed.add_field(name=f"",value=f"{i['rarity']['emoji']} {i['rarity']['name']} - {i['chance']*100:.02f}%",inline=False)
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
|
|
||||||
@commands.Cog.listener()
|
@commands.Cog.listener()
|
||||||
async def on_ready(self):
|
async def on_ready(self):
|
||||||
print(f'KrekFunBot roles module activated')
|
self.client.logger.info(f'KrekFunBot roles module activated')
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
self.me = disnake.utils.get(krekchat.roles, id=constants["me"])
|
self.me = disnake.utils.get(krekchat.roles, id=constants["me"])
|
||||||
|
|
||||||
@@ -50,9 +50,9 @@ class MainRolesModule(commands.Cog):
|
|||||||
description="цвет роли (указывается в hex формате, например: #ff9900)",
|
description="цвет роли (указывается в hex формате, например: #ff9900)",
|
||||||
name="цвет", default=0xff9900)):
|
name="цвет", default=0xff9900)):
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка создания роли")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка создания роли")
|
||||||
if ctx.guild is None:
|
if ctx.guild is None or not isinstance(ctx.author, disnake.Member):
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
await err_embed.send("Эта команда не работает в личных сообщениях!")
|
||||||
return
|
return
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
await self.client.UserUpdate(member = ctx.author, session = session)
|
await self.client.UserUpdate(member = ctx.author, session = session)
|
||||||
@@ -65,7 +65,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
custom_role = (await session.execute(stmt)).scalars().first()
|
custom_role = (await session.execute(stmt)).scalars().first()
|
||||||
|
|
||||||
if not custom_role is None:
|
if not custom_role is None:
|
||||||
await error_helper.out(d=f'Вы уже владеете кастомной ролью')
|
await err_embed.send(f'Вы уже владеете кастомной ролью')
|
||||||
return
|
return
|
||||||
|
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
@@ -73,24 +73,24 @@ class MainRolesModule(commands.Cog):
|
|||||||
borderbottom = krekchat.get_role(1221400071908753480)
|
borderbottom = krekchat.get_role(1221400071908753480)
|
||||||
|
|
||||||
if not (100 < cost < 2147483647):
|
if not (100 < cost < 2147483647):
|
||||||
await error_helper.out(d=f"Минимальная стоимость: 100 крошек")
|
await err_embed.send(f"Минимальная стоимость: 100 крошек")
|
||||||
return
|
return
|
||||||
|
|
||||||
if disnake.utils.get(ctx.guild.roles, name=name):
|
if disnake.utils.get(ctx.guild.roles, name=name):
|
||||||
await error_helper.out(d=f"Роль с таким названием уже есть на сервере")
|
await err_embed.send(f"Роль с таким названием уже есть на сервере")
|
||||||
return
|
return
|
||||||
|
|
||||||
stmt = self.DataBaseManager.select(self.DataBaseManager.func.count()).select_from(roles_custom_model)
|
stmt = self.DataBaseManager.select(self.DataBaseManager.func.count()).select_from(roles_custom_model)
|
||||||
count = (await session.execute(stmt)).scalars().first()
|
count = (await session.execute(stmt)).scalars().first()
|
||||||
if count >= 50:
|
if count >= 50:
|
||||||
await error_helper.out(d=f"На сервере сейчас максимальное количество кастомных ролей ({count}), попробуйте позже")
|
await err_embed.send(f"На сервере сейчас максимальное количество кастомных ролей ({count}), попробуйте позже")
|
||||||
return
|
return
|
||||||
|
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
stmt = self.DataBaseManager.select(users_model).where(users_model.id == ctx.author.id).with_for_update()
|
stmt = self.DataBaseManager.select(users_model).where(users_model.id == ctx.author.id).with_for_update()
|
||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
if user.crumbs < self.costrolecreate:
|
if user.crumbs < self.costrolecreate:
|
||||||
await error_helper.out(d=f"Для создания роли необходимо заплатить {self.costrolecreate} крошек, а у вас есть только {round(user.crumbs)}")
|
await err_embed.send(f"Для создания роли необходимо заплатить {self.costrolecreate} крошек, а у вас есть только {round(user.crumbs)}")
|
||||||
return
|
return
|
||||||
|
|
||||||
role = await ctx.guild.create_role(name=name, colour=colour)
|
role = await ctx.guild.create_role(name=name, colour=colour)
|
||||||
@@ -105,7 +105,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
await session.flush()
|
await session.flush()
|
||||||
received_role_custom = received_roles_custom_model(role_id = role.id, user_id = ctx.author.id)
|
received_role_custom = received_roles_custom_model(role_id = role.id, user_id = ctx.author.id)
|
||||||
session.add(received_role_custom)
|
session.add(received_role_custom)
|
||||||
await ctx.edit_original_message(embed=disnake.Embed(
|
await ctx.edit_original_message(embed=self.client.InfoEmbed(
|
||||||
title=f"Роль успешно создана! Вы можете проверить её статус или поменять настройки через команду /изменить роль",
|
title=f"Роль успешно создана! Вы можете проверить её статус или поменять настройки через команду /изменить роль",
|
||||||
description=f'', colour=0x2F3136))
|
description=f'', colour=0x2F3136))
|
||||||
|
|
||||||
@@ -118,7 +118,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
role: disnake.Role = commands.Param(description="О какой роли хотите получить информацию?",
|
role: disnake.Role = commands.Param(description="О какой роли хотите получить информацию?",
|
||||||
name="роль", default=None)):
|
name="роль", default=None)):
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка")
|
||||||
|
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
roles_custom_model = self.DataBaseManager.model_classes['roles_custom']
|
roles_custom_model = self.DataBaseManager.model_classes['roles_custom']
|
||||||
roles_static_model = self.DataBaseManager.model_classes['roles_static']
|
roles_static_model = self.DataBaseManager.model_classes['roles_static']
|
||||||
@@ -129,18 +130,18 @@ class MainRolesModule(commands.Cog):
|
|||||||
stmt = self.DataBaseManager.select(roles_custom_model).options(self.DataBaseManager.selectinload(roles_custom_model.users)).where(roles_custom_model.creator_id == ctx.author.id)
|
stmt = self.DataBaseManager.select(roles_custom_model).options(self.DataBaseManager.selectinload(roles_custom_model.users)).where(roles_custom_model.creator_id == ctx.author.id)
|
||||||
custom_role = (await session.execute(stmt)).scalars().first()
|
custom_role = (await session.execute(stmt)).scalars().first()
|
||||||
if custom_role is None:
|
if custom_role is None:
|
||||||
await error_helper.out(d=f'Вы не создавали кастомных ролей.\nЧтобы получить информацию о статичной роли, введите целевую роль в поле "роль" при вызове команды "/роль инфо"')
|
await err_embed.send(f'Вы не создавали кастомных ролей.\nЧтобы получить информацию о статичной роли, введите целевую роль в поле "роль" при вызове команды "/роль инфо"')
|
||||||
return
|
return
|
||||||
role = krekchat.get_role(custom_role.id)
|
role = krekchat.get_role(custom_role.id)
|
||||||
if role is None:
|
if role is None:
|
||||||
await error_helper.out(d=f'Вашей роли нет на сервере, вероятно, произошла ошибка, обратитесь к администратору')
|
await err_embed.send(f'Вашей роли нет на сервере, вероятно, произошла ошибка, обратитесь к администратору')
|
||||||
return
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
stmt = self.DataBaseManager.select(roles_static_model).where(roles_static_model.id == role.id)
|
stmt = self.DataBaseManager.select(roles_static_model).where(roles_static_model.id == role.id)
|
||||||
static_role = (await session.execute(stmt)).scalars().first()
|
static_role = (await session.execute(stmt)).scalars().first()
|
||||||
if not static_role is None:
|
if not static_role is None:
|
||||||
embed = disnake.Embed(title=f"", description=f'### Информация о статичной роли {role.mention}', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f'### Информация о статичной роли {role.mention}', colour=0x2F3136)
|
||||||
embed.add_field(name=f"Описание", value=f"> {static_role.description}", inline=True)
|
embed.add_field(name=f"Описание", value=f"> {static_role.description}", inline=True)
|
||||||
await ctx.edit_original_message(embed=embed)
|
await ctx.edit_original_message(embed=embed)
|
||||||
return
|
return
|
||||||
@@ -148,10 +149,10 @@ class MainRolesModule(commands.Cog):
|
|||||||
stmt = self.DataBaseManager.select(roles_custom_model).options(self.DataBaseManager.selectinload(roles_custom_model.users)).where(roles_custom_model.id == role.id)
|
stmt = self.DataBaseManager.select(roles_custom_model).options(self.DataBaseManager.selectinload(roles_custom_model.users)).where(roles_custom_model.id == role.id)
|
||||||
custom_role = (await session.execute(stmt)).scalars().first()
|
custom_role = (await session.execute(stmt)).scalars().first()
|
||||||
if custom_role is None:
|
if custom_role is None:
|
||||||
await error_helper.out(d=f'Описания этой роли пока не существует.')
|
await err_embed.send(f'Описания этой роли пока не существует.')
|
||||||
return
|
return
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"", description=f'### Информация о кастомной роли {role.mention}', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"", description=f'### Информация о кастомной роли {role.mention}', colour=0x2F3136)
|
||||||
embed.add_field(name=f"Время продления", value=f"> <t:{int(custom_role.renewal_date)}:D>", inline=True)
|
embed.add_field(name=f"Время продления", value=f"> <t:{int(custom_role.renewal_date)}:D>", inline=True)
|
||||||
embed.add_field(name=f"Цена продления", value=f"> {constants['costrolerenewal']}", inline=True)
|
embed.add_field(name=f"Цена продления", value=f"> {constants['costrolerenewal']}", inline=True)
|
||||||
embed.add_field(name=f"", value=f"", inline=False)
|
embed.add_field(name=f"", value=f"", inline=False)
|
||||||
@@ -172,10 +173,10 @@ class MainRolesModule(commands.Cog):
|
|||||||
@RoleChangeSlash.sub_command(description="Позволяет изменить вашу роль", name="роль")
|
@RoleChangeSlash.sub_command(description="Позволяет изменить вашу роль", name="роль")
|
||||||
async def RoleChangeSub(self, ctx: disnake.AppCmdInter):
|
async def RoleChangeSub(self, ctx: disnake.AppCmdInter):
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка изменения роли")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка изменения роли")
|
||||||
|
|
||||||
if ctx.guild is None:
|
if ctx.guild is None:
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
await err_embed.send("Эта команда не работает в личных сообщениях!")
|
||||||
return
|
return
|
||||||
|
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
@@ -193,8 +194,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Стоимость", custom_id="cost", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="Стоимость", custom_id="cost", style=disnake.ButtonStyle.blurple)
|
||||||
async def cost(self, button, inter):
|
async def cost(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете редактировать эту роль", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете редактировать эту роль")
|
||||||
await error.out()
|
await inter.send(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
modal = ActionModal(self.role, self.ctx, self.embed, "cost")
|
modal = ActionModal(self.role, self.ctx, self.embed, "cost")
|
||||||
await inter.response.send_modal(modal)
|
await inter.response.send_modal(modal)
|
||||||
@@ -202,8 +203,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Цвет", custom_id="color", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="Цвет", custom_id="color", style=disnake.ButtonStyle.blurple)
|
||||||
async def color(self, button, inter):
|
async def color(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете редактировать эту роль", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете редактировать эту роль")
|
||||||
await error.out()
|
await inter.send(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
modal = ActionModal(self.role, self.ctx, self.embed, "color")
|
modal = ActionModal(self.role, self.ctx, self.embed, "color")
|
||||||
await inter.response.send_modal(modal)
|
await inter.response.send_modal(modal)
|
||||||
@@ -211,8 +212,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Название", custom_id="name", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="Название", custom_id="name", style=disnake.ButtonStyle.blurple)
|
||||||
async def name(self, button, inter):
|
async def name(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете редактировать эту роль", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете редактировать эту роль")
|
||||||
await error.out()
|
await inter.send(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
modal = ActionModal(self.role, self.ctx, self.embed, "name")
|
modal = ActionModal(self.role, self.ctx, self.embed, "name")
|
||||||
await inter.response.send_modal(modal)
|
await inter.response.send_modal(modal)
|
||||||
@@ -220,8 +221,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Иконку", custom_id="icon", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="Иконку", custom_id="icon", style=disnake.ButtonStyle.blurple)
|
||||||
async def icon(self, button, inter):
|
async def icon(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете редактировать эту роль", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете редактировать эту роль")
|
||||||
await error.out()
|
await inter.send(embed=err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
modal = ActionModal(self.role, self.ctx, self.embed, "icon")
|
modal = ActionModal(self.role, self.ctx, self.embed, "icon")
|
||||||
await inter.response.send_modal(modal)
|
await inter.response.send_modal(modal)
|
||||||
@@ -234,11 +235,13 @@ class MainRolesModule(commands.Cog):
|
|||||||
|
|
||||||
class ActionModal(disnake.ui.Modal):
|
class ActionModal(disnake.ui.Modal):
|
||||||
DataBaseManager = self.DataBaseManager
|
DataBaseManager = self.DataBaseManager
|
||||||
|
client = self.client
|
||||||
def __init__(self, role, ctx, embed, operation):
|
def __init__(self, role, ctx, embed, operation):
|
||||||
self.role = role
|
self.role = role
|
||||||
self.ctx = ctx
|
self.ctx = ctx
|
||||||
self.embed = embed
|
self.embed = embed
|
||||||
self.operation = operation
|
self.operation = operation
|
||||||
|
components = []
|
||||||
if operation == "name":
|
if operation == "name":
|
||||||
components = [
|
components = [
|
||||||
disnake.ui.TextInput(label="Новое название", placeholder="Например: abc", custom_id="name",
|
disnake.ui.TextInput(label="Новое название", placeholder="Например: abc", custom_id="name",
|
||||||
@@ -262,9 +265,10 @@ class MainRolesModule(commands.Cog):
|
|||||||
|
|
||||||
super().__init__(title=operation, components=components, timeout=300)
|
super().__init__(title=operation, components=components, timeout=300)
|
||||||
|
|
||||||
async def callback(self, interaction: disnake.Interaction):
|
async def callback(self, interaction: disnake.ModalInteraction):
|
||||||
ctx = self.ctx
|
ctx = self.ctx
|
||||||
error_helper.send_function = interaction.send
|
err_embed = self.client.ErrEmbed(err_func = interaction.send, title = "Ошибка изменения роли")
|
||||||
|
|
||||||
async with self.DataBaseManager.session() as session:
|
async with self.DataBaseManager.session() as session:
|
||||||
key, value, = list(interaction.text_values.items())[0]
|
key, value, = list(interaction.text_values.items())[0]
|
||||||
await interaction.response.defer(ephemeral=True)
|
await interaction.response.defer(ephemeral=True)
|
||||||
@@ -276,7 +280,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
if self.operation == "cost":
|
if self.operation == "cost":
|
||||||
cost = abs(int(value))
|
cost = abs(int(value))
|
||||||
if not 100 < cost < 2147483647:
|
if not 100 < cost < 2147483647:
|
||||||
await error_helper.out(d = "Нельзя ставить стоимость роли меньше 100")
|
await err_embed.send("Нельзя ставить стоимость роли меньше 100")
|
||||||
return
|
return
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
async with self.DataBaseManager.models['roles_custom'] as roles_custom_model:
|
async with self.DataBaseManager.models['roles_custom'] as roles_custom_model:
|
||||||
@@ -286,47 +290,47 @@ class MainRolesModule(commands.Cog):
|
|||||||
image_url = value
|
image_url = value
|
||||||
TRUSTED_DOMAINS = ["imgur.com", "cdn.discordapp.com", "i.imgur.com"]
|
TRUSTED_DOMAINS = ["imgur.com", "cdn.discordapp.com", "i.imgur.com"]
|
||||||
if ctx.guild.premium_tier < 2:
|
if ctx.guild.premium_tier < 2:
|
||||||
await error_helper.out(d = "Этот сервер должен быть уровня 2 буста для изменения иконок ролей")
|
await err_embed.send("Этот сервер должен быть уровня 2 буста для изменения иконок ролей")
|
||||||
return
|
return
|
||||||
if not any(domain in image_url for domain in TRUSTED_DOMAINS):
|
if not any(domain in image_url for domain in TRUSTED_DOMAINS):
|
||||||
await error_helper.out(d = "Загрузка изображений разрешена только с ресурса https://imgur.com/")
|
await err_embed.send("Загрузка изображений разрешена только с ресурса https://imgur.com/")
|
||||||
return
|
return
|
||||||
if not image_url.lower().endswith((".png", ".jpg", ".jpeg")):
|
if not image_url.lower().endswith((".png", ".jpg", ".jpeg")):
|
||||||
await error_helper.out(d = "Разрешены только файлы с расширением .png, .jpg или .jpeg")
|
await err_embed.send("Разрешены только файлы с расширением .png, .jpg или .jpeg")
|
||||||
return
|
return
|
||||||
async with aiohttp.ClientSession() as session:
|
async with aiohttp.ClientSession() as http_session:
|
||||||
try:
|
try:
|
||||||
headers = {
|
headers = {
|
||||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
||||||
}
|
}
|
||||||
async with session.get(image_url, headers=headers) as resp:
|
async with http_session.get(image_url, headers=headers) as resp:
|
||||||
if resp.status != 200:
|
if resp.status != 200:
|
||||||
await error_helper.out(d = "Не удалось загрузить изображение")
|
await err_embed.send("Не удалось загрузить изображение")
|
||||||
return
|
return
|
||||||
|
|
||||||
content_type = resp.headers.get("Content-Type", "").lower()
|
content_type = resp.headers.get("Content-Type", "").lower()
|
||||||
if content_type not in ("image/png", "image/jpeg"):
|
if content_type not in ("image/png", "image/jpeg"):
|
||||||
await error_helper.out(d = "Файл должен быть изображением в формате PNG или JPEG")
|
await err_embed.send("Файл должен быть изображением в формате PNG или JPEG")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Проверка размера файла (не более 5 МБ)
|
# Проверка размера файла (не более 5 МБ)
|
||||||
content_length = int(resp.headers.get("Content-Length", 0))
|
content_length = int(resp.headers.get("Content-Length", 0))
|
||||||
if content_length > 5 * 1024 * 1024: # 5 МБ
|
if content_length > 5 * 1024 * 1024: # 5 МБ
|
||||||
await error_helper.out(d = "Размер файла не должен превышать 5 МБ")
|
await err_embed.send("Размер файла не должен превышать 5 МБ")
|
||||||
return
|
return
|
||||||
|
|
||||||
image_data = await resp.read() # Получаем изображение в виде bytes
|
image_data = await resp.read() # Получаем изображение в виде bytes
|
||||||
|
|
||||||
except aiohttp.ClientError as e:
|
except aiohttp.ClientError as e:
|
||||||
await error_helper.out(d = f"Ошибка при загрузке изображения: {e}")
|
await err_embed.send(f"Ошибка при загрузке изображения: {e}")
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
await self.role.edit(icon=image_data, reason=f"Иконка изменена пользователем {ctx.author}")
|
await self.role.edit(icon=image_data, reason=f"Иконка изменена пользователем {ctx.author}")
|
||||||
except disnake.Forbidden:
|
except disnake.Forbidden:
|
||||||
await error_helper.out(d = "У бота недостаточно прав для изменения роли")
|
await err_embed.send("У бота недостаточно прав для изменения роли")
|
||||||
return
|
return
|
||||||
except disnake.HTTPException as e:
|
except disnake.HTTPException as e:
|
||||||
await error_helper.out(d = f"Ошибка при изменении роли: {e}")
|
await err_embed.send(f"Ошибка при изменении роли: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
krekchat = await client.fetch_guild(constants["krekchat"])
|
krekchat = await client.fetch_guild(constants["krekchat"])
|
||||||
@@ -339,7 +343,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
custom_role = (await session.execute(stmt)).scalars().first()
|
custom_role = (await session.execute(stmt)).scalars().first()
|
||||||
self.embed.description = f"**Укажите, какой параметр вы хотите изменить у роли {role.mention}:**\n\n**1) Стоимость: **```{custom_role.cost} крошек```\n**2) Цвет: **```{role.color}```\n**3) Название: **```{role.name}```"
|
self.embed.description = f"**Укажите, какой параметр вы хотите изменить у роли {role.mention}:**\n\n**1) Стоимость: **```{custom_role.cost} крошек```\n**2) Цвет: **```{role.color}```\n**3) Название: **```{role.name}```"
|
||||||
|
|
||||||
await interaction.edit_original_message(embed=disnake.Embed(title="Роль успешно изменена!", description=f'', colour=0x2F3136))
|
await interaction.edit_original_message(embed=self.client.InfoEmbed(title="Роль успешно изменена!", description=f'', colour=0x2F3136))
|
||||||
|
|
||||||
await self.ctx.edit_original_message(embed=self.embed)
|
await self.ctx.edit_original_message(embed=self.embed)
|
||||||
|
|
||||||
@@ -349,15 +353,15 @@ class MainRolesModule(commands.Cog):
|
|||||||
stmt = self.DataBaseManager.select(users_model).options(self.DataBaseManager.joinedload(users_model.creation_role)).where(users_model.id == ctx.author.id)
|
stmt = self.DataBaseManager.select(users_model).options(self.DataBaseManager.joinedload(users_model.creation_role)).where(users_model.id == ctx.author.id)
|
||||||
user = (await session.execute(stmt)).scalars().first()
|
user = (await session.execute(stmt)).scalars().first()
|
||||||
if user.creation_role is None:
|
if user.creation_role is None:
|
||||||
await error_helper.out(d=f"Вы не создавали кастомных ролей")
|
await err_embed.send(f"Вы не создавали кастомных ролей")
|
||||||
return
|
return
|
||||||
|
|
||||||
role = krekchat.get_role(user.creation_role.id)
|
role = krekchat.get_role(user.creation_role.id)
|
||||||
if not role:
|
if not role:
|
||||||
await error_helper.out(d=f'Вашей роли нет на сервере')
|
await err_embed.send(f'Вашей роли нет на сервере')
|
||||||
return
|
return
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Управление ролью",
|
embed = self.client.InfoEmbed(title=f"Управление ролью",
|
||||||
description=f'**Укажите, какой параметр вы хотите изменить у роли {role.mention}:**\n\n**1) Стоимость: **```{user.creation_role.cost} крошек```\n**2) Цвет: **```{role.color}```\n**3) Название: **```{role.name}```',
|
description=f'**Укажите, какой параметр вы хотите изменить у роли {role.mention}:**\n\n**1) Стоимость: **```{user.creation_role.cost} крошек```\n**2) Цвет: **```{role.color}```\n**3) Название: **```{role.name}```',
|
||||||
colour=0x2F3136)
|
colour=0x2F3136)
|
||||||
embed.set_thumbnail(ctx.author.avatar)
|
embed.set_thumbnail(ctx.author.avatar)
|
||||||
@@ -373,9 +377,9 @@ class MainRolesModule(commands.Cog):
|
|||||||
@RoleInventorySlash.sub_command(description="Показывает все роли, которыми вы владеете", name="ролей")
|
@RoleInventorySlash.sub_command(description="Показывает все роли, которыми вы владеете", name="ролей")
|
||||||
async def RoleInventorySub(self, ctx: disnake.AppCmdInter):
|
async def RoleInventorySub(self, ctx: disnake.AppCmdInter):
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка инвентаря")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка инвентаря")
|
||||||
if ctx.guild is None:
|
if ctx.guild is None:
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
await err_embed.send("Эта команда не работает в личных сообщениях!")
|
||||||
return
|
return
|
||||||
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
|
|
||||||
@@ -396,48 +400,48 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="1", custom_id="1", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="1", custom_id="1", style=disnake.ButtonStyle.blurple)
|
||||||
async def one(self, button, inter):
|
async def one(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.ToggleRoles(inter, button)
|
await self.ToggleRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="2", custom_id="2", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="2", custom_id="2", style=disnake.ButtonStyle.blurple)
|
||||||
async def two(self, button, inter):
|
async def two(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.ToggleRoles(inter, button)
|
await self.ToggleRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="3", custom_id="3", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="3", custom_id="3", style=disnake.ButtonStyle.blurple)
|
||||||
async def three(self, button, inter):
|
async def three(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.ToggleRoles(inter, button)
|
await self.ToggleRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="4", custom_id="4", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="4", custom_id="4", style=disnake.ButtonStyle.blurple)
|
||||||
async def four(self, button, inter):
|
async def four(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.ToggleRoles(inter, button)
|
await self.ToggleRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="5", custom_id="5", style=disnake.ButtonStyle.blurple)
|
@disnake.ui.button(label="5", custom_id="5", style=disnake.ButtonStyle.blurple)
|
||||||
async def five(self, button, inter):
|
async def five(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.ToggleRoles(inter, button)
|
await self.ToggleRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="<", custom_id="left", style=disnake.ButtonStyle.secondary)
|
@disnake.ui.button(label="<", custom_id="left", style=disnake.ButtonStyle.secondary)
|
||||||
async def left(self, button, inter):
|
async def left(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page -= 1
|
self.page -= 1
|
||||||
self.left.disabled = (self.page == 1)
|
self.left.disabled = (self.page == 1)
|
||||||
@@ -448,8 +452,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label=">", custom_id="right", style=disnake.ButtonStyle.secondary)
|
@disnake.ui.button(label=">", custom_id="right", style=disnake.ButtonStyle.secondary)
|
||||||
async def right(self, button, inter):
|
async def right(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете управлять ролями другого участника", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете управлять ролями другого участника")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page += 1
|
self.page += 1
|
||||||
self.left.disabled = (self.page == 1)
|
self.left.disabled = (self.page == 1)
|
||||||
@@ -458,13 +462,13 @@ class MainRolesModule(commands.Cog):
|
|||||||
await inter.response.edit_message(embed=self.embed, view=self)
|
await inter.response.edit_message(embed=self.embed, view=self)
|
||||||
|
|
||||||
async def ToggleRoles(self, inter, button):
|
async def ToggleRoles(self, inter, button):
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка инвентаря", ephemeral = True)
|
err_embed = self.client.ErrEmbed(err_func = inter.send, err_func_kwargs = {'ephemeral': True}, title = "Ошибка инвентаря")
|
||||||
|
|
||||||
if len(self.inventory) < 1:
|
if len(self.inventory) < 1:
|
||||||
await error_helper.out(d=f'Роли с таким номером нет на странице')
|
await err_embed.send(f'Роли с таким номером нет на странице')
|
||||||
return
|
return
|
||||||
if len(self.inventory[self.page - 1]) < int(button.custom_id):
|
if len(self.inventory[self.page - 1]) < int(button.custom_id):
|
||||||
await error_helper.out(d=f'Роли с таким номером нет на странице')
|
await err_embed.send(f'Роли с таким номером нет на странице')
|
||||||
return
|
return
|
||||||
role = self.inventory[self.page - 1][int(button.custom_id) - 1]
|
role = self.inventory[self.page - 1][int(button.custom_id) - 1]
|
||||||
role = krekchat.get_role(role)
|
role = krekchat.get_role(role)
|
||||||
@@ -491,7 +495,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
roles_inventory_ids += [role.role_id for role in prize_roles if not role.role_id in roles_inventory_ids]
|
roles_inventory_ids += [role.role_id for role in prize_roles if not role.role_id in roles_inventory_ids]
|
||||||
|
|
||||||
if not role.id in roles_inventory_ids:
|
if not role.id in roles_inventory_ids:
|
||||||
await error_helper.out(d=f"Эта роль пропала из вашего инвентаря")
|
await err_embed.send(f"Эта роль пропала из вашего инвентаря")
|
||||||
return
|
return
|
||||||
await self.ctx.author.add_roles(role)
|
await self.ctx.author.add_roles(role)
|
||||||
self.embed = await EmbedRoleInventoryChanger(self.inventory, self.embed, self.page, self.ctx.author)
|
self.embed = await EmbedRoleInventoryChanger(self.inventory, self.embed, self.page, self.ctx.author)
|
||||||
@@ -546,7 +550,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
roles_inventory_sorted_ids += [role.role_id for role in custom_roles if not role.role_id in roles_inventory_sorted_ids]
|
roles_inventory_sorted_ids += [role.role_id for role in custom_roles if not role.role_id in roles_inventory_sorted_ids]
|
||||||
|
|
||||||
ready_array = self.client.PartitioningEmbeder(roles_inventory_sorted_ids)
|
ready_array = self.client.PartitioningEmbeder(roles_inventory_sorted_ids)
|
||||||
embed = disnake.Embed(title=f"Инвентарь ролей", description=f'', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Инвентарь ролей", description=f'', colour=0x2F3136)
|
||||||
embed.set_thumbnail(ctx.author.avatar)
|
embed.set_thumbnail(ctx.author.avatar)
|
||||||
view = RolesInventoryButtons(ctx, ready_array, embed)
|
view = RolesInventoryButtons(ctx, ready_array, embed)
|
||||||
|
|
||||||
@@ -567,17 +571,17 @@ class MainRolesModule(commands.Cog):
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
await ctx.response.defer()
|
await ctx.response.defer()
|
||||||
error_helper = self.client.ErrorOutHelper(send_function = ctx.edit_original_message, err_name = "Ошибка магазина")
|
err_embed = self.client.ErrEmbed(err_func = ctx.edit_original_message, title = "Ошибка магазина")
|
||||||
DataBaseManager = self.DataBaseManager
|
DataBaseManager = self.DataBaseManager
|
||||||
|
|
||||||
if ctx.guild is None:
|
if ctx.guild is None:
|
||||||
await error_helper.out(d="Эта команда не работает в личных сообщениях!")
|
await err_embed.send("Эта команда не работает в личных сообщениях!")
|
||||||
return
|
return
|
||||||
PartitioningEmbeder = self.client.PartitioningEmbeder
|
PartitioningEmbeder = self.client.PartitioningEmbeder
|
||||||
client = self.client
|
krekchat = await self.client.fetch_guild(constants["krekchat"])
|
||||||
krekchat = await client.fetch_guild(constants["krekchat"])
|
|
||||||
|
|
||||||
class ShopView(disnake.ui.View):
|
class ShopView(disnake.ui.View):
|
||||||
|
client = self.client
|
||||||
def __init__(self, ctx, embed):
|
def __init__(self, ctx, embed):
|
||||||
super().__init__(timeout=180)
|
super().__init__(timeout=180)
|
||||||
self.ctx = ctx
|
self.ctx = ctx
|
||||||
@@ -619,8 +623,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
async def leftmax(self, button, inter):
|
async def leftmax(self, button, inter):
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page = 1
|
self.page = 1
|
||||||
self.leftmax.disabled = (self.page == 1)
|
self.leftmax.disabled = (self.page == 1)
|
||||||
@@ -636,8 +640,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
async def left(self, button, inter):
|
async def left(self, button, inter):
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page = max(self.page - 1, 1)
|
self.page = max(self.page - 1, 1)
|
||||||
self.leftmax.disabled = (self.page == 1)
|
self.leftmax.disabled = (self.page == 1)
|
||||||
@@ -653,8 +657,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
async def right(self, button, inter):
|
async def right(self, button, inter):
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page = min(self.page + 1, self.maxpage)
|
self.page = min(self.page + 1, self.maxpage)
|
||||||
self.leftmax.disabled = (self.page == 1)
|
self.leftmax.disabled = (self.page == 1)
|
||||||
@@ -670,8 +674,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
async def rightmax(self, button, inter):
|
async def rightmax(self, button, inter):
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page = self.maxpage
|
self.page = self.maxpage
|
||||||
self.leftmax.disabled = (self.page == 1)
|
self.leftmax.disabled = (self.page == 1)
|
||||||
@@ -699,8 +703,8 @@ class MainRolesModule(commands.Cog):
|
|||||||
async def sort(self, select: disnake.ui.StringSelect, inter: disnake.MessageInteraction):
|
async def sort(self, select: disnake.ui.StringSelect, inter: disnake.MessageInteraction):
|
||||||
await inter.response.defer()
|
await inter.response.defer()
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
self.page = 1
|
self.page = 1
|
||||||
self.leftmax.disabled = (self.page == 1)
|
self.leftmax.disabled = (self.page == 1)
|
||||||
@@ -721,40 +725,40 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="1", custom_id="1", style=disnake.ButtonStyle.blurple, row=3)
|
@disnake.ui.button(label="1", custom_id="1", style=disnake.ButtonStyle.blurple, row=3)
|
||||||
async def one(self, button, inter):
|
async def one(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.BuyRoles(inter, button)
|
await self.BuyRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="2", custom_id="2", style=disnake.ButtonStyle.blurple, row=3)
|
@disnake.ui.button(label="2", custom_id="2", style=disnake.ButtonStyle.blurple, row=3)
|
||||||
async def two(self, button, inter):
|
async def two(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.BuyRoles(inter, button)
|
await self.BuyRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="3", custom_id="3", style=disnake.ButtonStyle.blurple, row=3)
|
@disnake.ui.button(label="3", custom_id="3", style=disnake.ButtonStyle.blurple, row=3)
|
||||||
async def three(self, button, inter):
|
async def three(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.BuyRoles(inter, button)
|
await self.BuyRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="4", custom_id="4", style=disnake.ButtonStyle.blurple, row=3)
|
@disnake.ui.button(label="4", custom_id="4", style=disnake.ButtonStyle.blurple, row=3)
|
||||||
async def four(self, button, inter):
|
async def four(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.BuyRoles(inter, button)
|
await self.BuyRoles(inter, button)
|
||||||
|
|
||||||
@disnake.ui.button(label="5", custom_id="5", style=disnake.ButtonStyle.blurple, row=3)
|
@disnake.ui.button(label="5", custom_id="5", style=disnake.ButtonStyle.blurple, row=3)
|
||||||
async def five(self, button, inter):
|
async def five(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
await self.BuyRoles(inter, button)
|
await self.BuyRoles(inter, button)
|
||||||
|
|
||||||
@@ -765,7 +769,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
await self.ctx.edit_original_message(view=self)
|
await self.ctx.edit_original_message(view=self)
|
||||||
|
|
||||||
async def BuyRoles(self, inter, button):
|
async def BuyRoles(self, inter, button):
|
||||||
error_helper = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка покупки", ephemeral = True)
|
err_embed = self.client.ErrEmbed(err_func = inter.send, err_func_kwargs = {'ephemeral': True}, title = "Ошибка покупки")
|
||||||
async with DataBaseManager.session() as session:
|
async with DataBaseManager.session() as session:
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
async with DataBaseManager.models['users'] as users_model:
|
async with DataBaseManager.models['users'] as users_model:
|
||||||
@@ -777,24 +781,25 @@ class MainRolesModule(commands.Cog):
|
|||||||
self.page - 1]
|
self.page - 1]
|
||||||
|
|
||||||
if len(page) < int(button.custom_id):
|
if len(page) < int(button.custom_id):
|
||||||
await error_helper.out(d=f'Роли с таким номером нет на странице')
|
await err_embed.send(f'Роли с таким номером нет на странице')
|
||||||
return
|
return
|
||||||
|
|
||||||
custom_role = page[int(button.custom_id) - 1]
|
custom_role = page[int(button.custom_id) - 1]
|
||||||
if user.crumbs < custom_role.cost:
|
if user.crumbs < custom_role.cost:
|
||||||
await error_helper.out(d=f'У вас недостаточно крошек')
|
await err_embed.send(f'У вас недостаточно крошек')
|
||||||
return
|
return
|
||||||
|
|
||||||
if custom_role.id in [role.id for role in user.custom_roles]:
|
if custom_role.id in [role.id for role in user.custom_roles]:
|
||||||
await error_helper.out(d=f'У вас уже есть эта роль')
|
await err_embed.send(f'У вас уже есть эта роль')
|
||||||
return
|
return
|
||||||
|
|
||||||
role = krekchat.get_role(custom_role.id)
|
role = krekchat.get_role(custom_role.id)
|
||||||
confirmembed = disnake.Embed(description=f'Вы уверены, что хотите преобрести роль {role.mention if role else custom_role.id} за {custom_role.cost} крошек?',
|
confirmembed = self.client.InfoEmbed(description=f'Вы уверены, что хотите преобрести роль {role.mention if role else custom_role.id} за {custom_role.cost} крошек?',
|
||||||
colour=0x2F3136)
|
colour=0x2F3136)
|
||||||
ConfMessage = ConfirmView(self.ctx, role, custom_role)
|
ConfMessage = ConfirmView(self.ctx, role, custom_role)
|
||||||
await inter.response.edit_message(view=ConfMessage, embed=confirmembed)
|
await inter.response.edit_message(view=ConfMessage, embed=confirmembed)
|
||||||
class ConfirmView(disnake.ui.View):
|
class ConfirmView(disnake.ui.View):
|
||||||
|
client = self.client
|
||||||
def __init__(self, ctx, role, custom_role):
|
def __init__(self, ctx, role, custom_role):
|
||||||
super().__init__(timeout=180)
|
super().__init__(timeout=180)
|
||||||
self.ctx = ctx
|
self.ctx = ctx
|
||||||
@@ -804,12 +809,12 @@ class MainRolesModule(commands.Cog):
|
|||||||
@disnake.ui.button(label="Да", custom_id="yes", style=disnake.ButtonStyle.green)
|
@disnake.ui.button(label="Да", custom_id="yes", style=disnake.ButtonStyle.green)
|
||||||
async def yes(self, button, inter):
|
async def yes(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли за другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
if not self.role:
|
if not self.role:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка покупки", err_description = "Такая роль не найдена на сервере. Возможно, это ошибка базы данных", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка покупки", description = "Такая роль не найдена на сервере. Возможно, это ошибка базы данных")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
|
|
||||||
ctx = self.ctx
|
ctx = self.ctx
|
||||||
@@ -826,19 +831,19 @@ class MainRolesModule(commands.Cog):
|
|||||||
session.add(receive)
|
session.add(receive)
|
||||||
history = DataBaseManager.models['transaction_history_crumbs'].m(sender_id = user.id, recipient_id = creator.id, amount = self.custom_role.cost, description = f"Покупка роли {self.role.mention}")
|
history = DataBaseManager.models['transaction_history_crumbs'].m(sender_id = user.id, recipient_id = creator.id, amount = self.custom_role.cost, description = f"Покупка роли {self.role.mention}")
|
||||||
await self.ctx.author.add_roles(self.role)
|
await self.ctx.author.add_roles(self.role)
|
||||||
embed = disnake.Embed(description=f'Роль {self.role.mention} успешно преобретена!', colour=0x2F3136)
|
embed = self.client.InfoEmbed(description=f'Роль {self.role.mention} успешно преобретена!', colour=0x2F3136)
|
||||||
await self.ctx.edit_original_message(embed=embed, view=None)
|
await self.ctx.edit_original_message(embed=embed, view=None)
|
||||||
|
|
||||||
@disnake.ui.button(label="Нет", custom_id="no", style=disnake.ButtonStyle.red)
|
@disnake.ui.button(label="Нет", custom_id="no", style=disnake.ButtonStyle.red)
|
||||||
async def no(self, button, inter):
|
async def no(self, button, inter):
|
||||||
if inter.author != self.ctx.author:
|
if inter.author != self.ctx.author:
|
||||||
error = client.ErrorOutHelper(send_function = inter.send, err_name = "Ошибка доступа", err_description = "Вы не можете покупать роли за другого участника. Используйте команду `/магазин ролей`, чтобы купить роли", ephemeral = True)
|
err_embed = self.client.ErrEmbed(title = "Ошибка доступа", description = "Вы не можете покупать роли в магазине другого участника. Используйте команду `/магазин ролей`, чтобы купить роли")
|
||||||
await error.out()
|
await inter.send(embed = err_embed, ephemeral = True)
|
||||||
return
|
return
|
||||||
|
|
||||||
ctx = self.ctx
|
ctx = self.ctx
|
||||||
|
|
||||||
embed = disnake.Embed(title=f"Магазин ролей", description=f'', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Магазин ролей", description=f'', colour=0x2F3136)
|
||||||
ShopMessage = ShopView(ctx, embed)
|
ShopMessage = ShopView(ctx, embed)
|
||||||
await ShopMessage.initialize()
|
await ShopMessage.initialize()
|
||||||
ShopMessage.leftmax.disabled = (ShopMessage.page == 1)
|
ShopMessage.leftmax.disabled = (ShopMessage.page == 1)
|
||||||
@@ -902,7 +907,7 @@ class MainRolesModule(commands.Cog):
|
|||||||
inline=False)
|
inline=False)
|
||||||
c += 1
|
c += 1
|
||||||
return embed
|
return embed
|
||||||
embed = disnake.Embed(title=f"Магазин ролей", description=f'', colour=0x2F3136)
|
embed = self.client.InfoEmbed(title=f"Магазин ролей", description=f'', colour=0x2F3136)
|
||||||
async with DataBaseManager.session() as session:
|
async with DataBaseManager.session() as session:
|
||||||
await self.client.UserUpdate(ctx.author, session = session)
|
await self.client.UserUpdate(ctx.author, session = session)
|
||||||
async with session.begin():
|
async with session.begin():
|
||||||
|
|||||||
@@ -113,19 +113,19 @@ rimagochi_capsules = {
|
|||||||
{"rarity": rimagochi_rarity[36], "chance": rimagochi_rarity[36]["standart_chance"]},
|
{"rarity": rimagochi_rarity[36], "chance": rimagochi_rarity[36]["standart_chance"]},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
52: {
|
# 52: {
|
||||||
'id': 52,
|
# 'id': 52,
|
||||||
'name': 'аномальный саркофаг криптосна',
|
# 'name': 'аномальный саркофаг криптосна',
|
||||||
'cost': 3000,
|
# 'cost': 3000,
|
||||||
'chances': [
|
# 'chances': [
|
||||||
{"rarity": rimagochi_rarity[31], "chance": 0.001},
|
# {"rarity": rimagochi_rarity[31], "chance": 0.001},
|
||||||
{"rarity": rimagochi_rarity[37], "chance": 0.04},
|
# {"rarity": rimagochi_rarity[37], "chance": 0.04},
|
||||||
{"rarity": rimagochi_rarity[32], "chance": 0.02},
|
# {"rarity": rimagochi_rarity[32], "chance": 0.02},
|
||||||
{"rarity": rimagochi_rarity[33], "chance": 0.2},
|
# {"rarity": rimagochi_rarity[33], "chance": 0.2},
|
||||||
{"rarity": rimagochi_rarity[34], "chance": 0.3},
|
# {"rarity": rimagochi_rarity[34], "chance": 0.3},
|
||||||
{"rarity": rimagochi_rarity[35], "chance": 0.439},
|
# {"rarity": rimagochi_rarity[35], "chance": 0.439},
|
||||||
],
|
# ],
|
||||||
},
|
# },
|
||||||
}
|
}
|
||||||
rimagochi_animals = {
|
rimagochi_animals = {
|
||||||
261: {
|
261: {
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ def render(data, design):
|
|||||||
# Текст
|
# Текст
|
||||||
try:
|
try:
|
||||||
font = ImageFont.truetype("src/data/fonts/segoeuib.ttf", 24*scale)
|
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)
|
font = ImageFont.truetype("src/data/fonts/segoeuib.ttf", 20*scale)
|
||||||
if len(data['nick']) > 12:
|
if len(data['nick']) > 12:
|
||||||
data['nick'].replace("_", " ")
|
data['nick'].replace("_", " ")
|
||||||
|
|||||||
BIN
src/data/service_information/animals.xlsx
Normal file
BIN
src/data/service_information/animals.xlsx
Normal file
Binary file not shown.
BIN
src/data/service_information/rebalance_animals.xlsx
Normal file
BIN
src/data/service_information/rebalance_animals.xlsx
Normal file
Binary file not shown.
@@ -1,5 +1,7 @@
|
|||||||
DB_HOST='localhost'
|
import os
|
||||||
DB_PORT=5432
|
|
||||||
DB_USER='discord_economy_bot'
|
DB_HOST=os.getenv("DB_HOST", "localhost")
|
||||||
DB_PASS='economy_bot'
|
DB_PORT=os.getenv("DB_PORT", "5432")
|
||||||
DB_NAME='discord_economy_bot_db'
|
DB_USER=os.getenv("DB_USER", "discord_economy_bot")
|
||||||
|
DB_PASS=os.getenv("DB_PASSWORD", "economy_bot")
|
||||||
|
DB_NAME=os.getenv("DB_NAME", "discord_economy_bot_db")
|
||||||
16
src/libs/tokens_formatter.py
Normal file
16
src/libs/tokens_formatter.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
import os
|
||||||
|
TOKENS: dict[str, str] = {}
|
||||||
|
|
||||||
|
token_files = {
|
||||||
|
'KrekAdminBot': "secrets/TOKEN_KrekAdminBot.txt",
|
||||||
|
'KrekFunBot': "secrets/TOKEN_KrekFunBot.txt",
|
||||||
|
'KrekRimagochiBot': "secrets/TOKEN_KrekRimagochiBot.txt",
|
||||||
|
'KrekSupBot': "secrets/TOKEN_KrekSupBot.txt",
|
||||||
|
'KrekModBot': "secrets/TOKEN_KrekModBot.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
for bot, path in token_files.items():
|
||||||
|
if os.path.exists(path):
|
||||||
|
with open(path, "r") as file:
|
||||||
|
TOKENS[bot] = file.read()
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import disnake
|
import disnake
|
||||||
from disnake.ext import commands
|
from disnake.ext import commands
|
||||||
from disnake.ext import tasks
|
from disnake.ext import tasks
|
||||||
@@ -91,18 +92,18 @@ class DatabaseManager:
|
|||||||
print(f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: SQL backup of '{db_name}' created.")
|
print(f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: SQL backup of '{db_name}' created.")
|
||||||
return backup_file
|
return backup_file
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
print(f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: Backup failed: {e}")
|
logging.exception(f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: Backup failed: {e}")
|
||||||
return f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: Backup failed: {e}"
|
return f"{datetime.datetime.now():%H:%M:%S %d-%m-%Y} :: Backup failed: {e}"
|
||||||
finally:
|
finally:
|
||||||
await conn.close()
|
await conn.close()
|
||||||
|
|
||||||
async def pg_restore(self, echo = False, backup_file = 'src/backups/backup_file.backup'):
|
async def pg_restore(self, echo = False, backup_file = 'src/backups/backup_file.backup'):
|
||||||
conn = await self.DataBaseManager.engine.connect()
|
conn = await self.engine.connect()
|
||||||
db_name = self.DataBaseManager.engine.url.database
|
db_name = self.engine.url.database
|
||||||
user = self.DataBaseManager.engine.url.username
|
user = self.engine.url.username
|
||||||
host = self.DataBaseManager.engine.url.host
|
host = self.engine.url.host
|
||||||
port = self.DataBaseManager.engine.url.port
|
port = self.engine.url.port
|
||||||
password = self.DataBaseManager.engine.url.password
|
password = self.engine.url.password
|
||||||
|
|
||||||
os.environ['PGPASSWORD'] = password # Установка пароля для подключения
|
os.environ['PGPASSWORD'] = password # Установка пароля для подключения
|
||||||
command = [
|
command = [
|
||||||
|
|||||||
@@ -1,239 +0,0 @@
|
|||||||
try:
|
|
||||||
import aiosqlite
|
|
||||||
import disnake
|
|
||||||
from disnake.ext import commands
|
|
||||||
from disnake.ext import tasks
|
|
||||||
except:
|
|
||||||
import pip
|
|
||||||
|
|
||||||
pip.main(['install', 'disnake'])
|
|
||||||
pip.main(['install', 'aiosqlite'])
|
|
||||||
import disnake
|
|
||||||
from disnake.ext import commands
|
|
||||||
from disnake.ext import tasks
|
|
||||||
import aiosqlite
|
|
||||||
from typing import Optional, Union, List, Dict, Any, AsyncIterator, Tuple
|
|
||||||
from asyncio import Lock
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
class DatabaseManager:
|
|
||||||
"""Расширенное соединение с БД с поддержкой транзакций и удобных методов"""
|
|
||||||
|
|
||||||
def __init__(self, connection: aiosqlite.Connection):
|
|
||||||
self._connection = connection
|
|
||||||
self._transaction_depth = 0
|
|
||||||
self._closed = False
|
|
||||||
self._transaction_lock = Lock()
|
|
||||||
self.last_error = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def connect(cls, database: str, **kwargs) -> 'DatabaseManager':
|
|
||||||
"""Альтернатива конструктору для подключения"""
|
|
||||||
connection = await aiosqlite.connect(database, **kwargs)
|
|
||||||
return cls(connection)
|
|
||||||
|
|
||||||
async def UpdateBD(self, table: str, *, change: dict, where: dict, whereandor = "AND"):
|
|
||||||
request = ()
|
|
||||||
|
|
||||||
change_request = []
|
|
||||||
for i in change.keys():
|
|
||||||
change_request.append(f"{i} = ?")
|
|
||||||
request = request + (change[i],)
|
|
||||||
|
|
||||||
where_request = []
|
|
||||||
for i in where.keys():
|
|
||||||
where_request.append(f"{i} = ?")
|
|
||||||
request = request + (where[i],)
|
|
||||||
|
|
||||||
await self.execute('UPDATE {table} SET {change} WHERE {where}'
|
|
||||||
.format(table = table, change = ", ".join(change_request), where = f" {whereandor} ".join(where_request)), request)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
async def SelectBD(self, table: str, *, select: list = ["*"], where: dict = None, where_ops: dict = None, whereandor = "AND", order_by: str = None, limit: int = None):
|
|
||||||
|
|
||||||
where_combined = {}
|
|
||||||
if where:
|
|
||||||
where_combined.update({f"{k} =": v for k, v in where.items()})
|
|
||||||
if where_ops:
|
|
||||||
where_combined.update(where_ops)
|
|
||||||
|
|
||||||
request = ()
|
|
||||||
where_clauses = ""
|
|
||||||
|
|
||||||
for condition, value in where_combined.items():
|
|
||||||
field_op = condition.split()
|
|
||||||
field = field_op[0]
|
|
||||||
op = "=" if len(field_op) == 1 else field_op[1]
|
|
||||||
if where_clauses == "":
|
|
||||||
where_clauses= where_clauses + f"{field} {op} ? "
|
|
||||||
else:
|
|
||||||
where_clauses= where_clauses + f"{whereandor} {field} {op} ? "
|
|
||||||
request += (value,)
|
|
||||||
|
|
||||||
query = "SELECT {select} FROM {table}".format(
|
|
||||||
select=", ".join(select),
|
|
||||||
table=table
|
|
||||||
)
|
|
||||||
|
|
||||||
if where_clauses:
|
|
||||||
query += f" WHERE {where_clauses}"
|
|
||||||
|
|
||||||
if order_by:
|
|
||||||
query += f" ORDER BY {order_by}"
|
|
||||||
|
|
||||||
if limit:
|
|
||||||
query += f" LIMIT {limit}"
|
|
||||||
|
|
||||||
async with await self.execute(query, request) as cursor:
|
|
||||||
return [i for i in await cursor.fetchall()]
|
|
||||||
|
|
||||||
async def GetStaffJoins():
|
|
||||||
query = \
|
|
||||||
"""
|
|
||||||
SELECT sur.userid, sur.roleid, sur.description, sur.starttime, sr.staffsalary, sbr.layer as rolelayer, sbr.branchid, sb.layer as branchlayer, sb.purpose
|
|
||||||
FROM staff_users_roles AS sur
|
|
||||||
JOIN staff_roles as sr ON sr.roleid = sur.roleid
|
|
||||||
JOIN staff_branches_roles as sbr ON sbr.roleid = sur.roleid
|
|
||||||
JOIN staff_branches as sb ON sb.branchid = sbr.branchid
|
|
||||||
ORDER BY branchlayer ASC, rolelayer ASC;
|
|
||||||
"""
|
|
||||||
async with await self.execute(query, request) as cursor:
|
|
||||||
answer = [i for i in await cursor.fetchall()]
|
|
||||||
result = [{'userid': userid, 'roleid': roleid, 'description': description, 'starttime': starttime, 'staffsalary': staffsalary, 'rolelayer': rolelayer, 'branchid': branchid, 'branchlayer': branchlayer, 'purpose': purpose} for userid, roleid, description, starttime, staffsalary, rolelayer, branchid, branchlayer, purpose in answer]
|
|
||||||
return result
|
|
||||||
|
|
||||||
async def DeleteBD(self, table: str, *, where: dict, whereandor = "AND"):
|
|
||||||
request = ()
|
|
||||||
where_request = []
|
|
||||||
for i in where.keys():
|
|
||||||
where_request.append(f"{i} = ?")
|
|
||||||
request = request + (where[i],)
|
|
||||||
await self.execute("DELETE FROM {table} where {where}"
|
|
||||||
.format(table = table, where = f" {whereandor} ".join(where_request)), request)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
async def InsertBD(self, table: str, *, data: dict):
|
|
||||||
request = ()
|
|
||||||
keys = list(data.keys())
|
|
||||||
qstring = []
|
|
||||||
for i in keys:
|
|
||||||
request = request + (data[i],)
|
|
||||||
qstring.append("?")
|
|
||||||
await self.execute("INSERT INTO {table}({keys}) VALUES({values})"
|
|
||||||
.format(table = table, keys = ", ".join(keys), values = ", ".join(qstring)), request)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
async def execute(self, sql: str, parameters: Optional[Union[Tuple, Dict]] = None, **kwargs) -> aiosqlite.Cursor:
|
|
||||||
"""
|
|
||||||
Универсальный execute, который автоматически определяет:
|
|
||||||
- Нужно ли начинать транзакцию (для INSERT/UPDATE/DELETE вне транзакции)
|
|
||||||
- Работает ли уже внутри транзакции (не создаёт вложенные транзакции)
|
|
||||||
"""
|
|
||||||
is_modifying = sql.strip().upper().startswith(("INSERT", "UPDATE", "DELETE"))
|
|
||||||
|
|
||||||
# Если это модифицирующий запрос И мы НЕ внутри транзакции
|
|
||||||
if is_modifying and self._transaction_depth == 0:
|
|
||||||
async with self: # Автоматические begin/commit
|
|
||||||
cursor = await self._connection.execute(sql, parameters or (), **kwargs)
|
|
||||||
await cursor.close() # Важно: закрываем курсор для COMMIT
|
|
||||||
return cursor
|
|
||||||
else:
|
|
||||||
# Для SELECT или работы внутри существующей транзакции
|
|
||||||
return await self._connection.execute(sql, parameters or (), **kwargs)
|
|
||||||
|
|
||||||
async def fetch_all(self, sql: str, parameters: Optional[Union[Tuple, Dict]] = None) -> List[Tuple]:
|
|
||||||
"""Выполняет запрос и возвращает все строки"""
|
|
||||||
async with await self.execute(sql, parameters) as cursor:
|
|
||||||
return await cursor.fetchall()
|
|
||||||
|
|
||||||
async def fetch_one(self, sql: str, parameters: Optional[Union[Tuple, Dict]] = None) -> Optional[Tuple]:
|
|
||||||
"""Выполняет запрос и возвращает первую строку"""
|
|
||||||
async with await self.execute(sql, parameters) as cursor:
|
|
||||||
return await cursor.fetchone()
|
|
||||||
|
|
||||||
async def fetch_val(self, sql: str, parameters: Optional[Union[Tuple, Dict]] = None, column: int = 0) -> Any:
|
|
||||||
"""Возвращает значение из первого столбца"""
|
|
||||||
row = await self.fetch_one(sql, parameters)
|
|
||||||
return row[column] if row else None
|
|
||||||
|
|
||||||
async def insert(self, table: str, data: Dict[str, Any], on_conflict: str = None) -> int:
|
|
||||||
"""Упрощенный INSERT с поддержкой ON CONFLICT"""
|
|
||||||
keys = data.keys()
|
|
||||||
values = list(data.values())
|
|
||||||
|
|
||||||
sql = f"""
|
|
||||||
INSERT INTO {table} ({', '.join(keys)})
|
|
||||||
VALUES ({', '.join(['?']*len(keys))})
|
|
||||||
"""
|
|
||||||
|
|
||||||
if on_conflict:
|
|
||||||
sql += f" ON CONFLICT {on_conflict}"
|
|
||||||
|
|
||||||
await self.execute(sql, values)
|
|
||||||
return self.lastrowid
|
|
||||||
|
|
||||||
async def update(self, table: str, where: Dict[str, Any], changes: Dict[str, Any], where_operator: str = "AND") -> int:
|
|
||||||
"""Упрощенный UPDATE с автоматическим построением WHERE"""
|
|
||||||
set_clause = ", ".join([f"{k} = ?" for k in changes.keys()])
|
|
||||||
where_clause = f" {where_operator} ".join([f"{k} = ?" for k in where.keys()])
|
|
||||||
|
|
||||||
sql = f"""
|
|
||||||
UPDATE {table}
|
|
||||||
SET {set_clause}
|
|
||||||
WHERE {where_clause}
|
|
||||||
"""
|
|
||||||
|
|
||||||
result = await self.execute(sql, [*changes.values(), *where.values()])
|
|
||||||
return result.rowcount
|
|
||||||
|
|
||||||
async def begin(self):
|
|
||||||
"""Начать транзакцию (с поддержкой вложенности)"""
|
|
||||||
async with self._transaction_lock:
|
|
||||||
if self._transaction_depth == 0:
|
|
||||||
await self._connection.execute("BEGIN IMMEDIATE")
|
|
||||||
self._transaction_depth += 1
|
|
||||||
|
|
||||||
async def commit(self):
|
|
||||||
"""Зафиксировать транзакцию"""
|
|
||||||
async with self._transaction_lock:
|
|
||||||
if self._transaction_depth == 1:
|
|
||||||
await self._connection.commit()
|
|
||||||
self._transaction_depth = max(0, self._transaction_depth - 1)
|
|
||||||
|
|
||||||
async def rollback(self):
|
|
||||||
"""Откатить транзакцию"""
|
|
||||||
async with self._transaction_lock:
|
|
||||||
if self._transaction_depth > 0:
|
|
||||||
await self._connection.rollback()
|
|
||||||
self._transaction_depth = 0
|
|
||||||
|
|
||||||
async def close(self) -> None:
|
|
||||||
"""Безопасное закрытие соединения с учётом транзакций"""
|
|
||||||
async with self._transaction_lock:
|
|
||||||
try:
|
|
||||||
# Откатываем активную транзакцию, если есть
|
|
||||||
if self._transaction_depth > 0:
|
|
||||||
await self._connection.rollback()
|
|
||||||
self._transaction_depth = 0
|
|
||||||
|
|
||||||
# Закрываем соединение
|
|
||||||
if hasattr(self._connection, '_connection'): # Проверка внутреннего состояния
|
|
||||||
await self._connection.close()
|
|
||||||
except Exception as e:
|
|
||||||
self.last_error = f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Ошибка при закрытии соединения: {e}"
|
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Ошибка при закрытии соединения: {e}")
|
|
||||||
finally:
|
|
||||||
# Помечаем соединение как закрытое
|
|
||||||
self._closed = True
|
|
||||||
|
|
||||||
async def __aenter__(self):
|
|
||||||
await self.begin() # Используем собственный метод begin
|
|
||||||
return self # Возвращаем сам менеджер, а не соединение
|
|
||||||
|
|
||||||
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
||||||
if exc_type is None:
|
|
||||||
await self.commit()
|
|
||||||
else:
|
|
||||||
self.last_error = f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Во время записи в бд произошла ошибка: {exc_type}({exc_val}): {exc_tb.tb_frame.f_code.co_filename}(строка {exc_tb.tb_lineno})!"
|
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Во время записи в бд произошла ошибка: {exc_type}({exc_val}): {exc_tb.tb_frame.f_code.co_filename}(строка {exc_tb.tb_lineno})!")
|
|
||||||
await self.rollback()
|
|
||||||
20
src/test.py
20
src/test.py
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import logging
|
||||||
import disnake
|
import disnake
|
||||||
from disnake.ext import commands
|
from disnake.ext import commands
|
||||||
from disnake.ext import tasks
|
from disnake.ext import tasks
|
||||||
@@ -16,10 +17,11 @@ import json
|
|||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
from constants.global_constants import *
|
from constants.global_constants import *
|
||||||
from data.secrets.TOKENS import TOKENS
|
from libs.tokens_formatter import TOKENS
|
||||||
|
|
||||||
import CoreFun
|
import CoreFun
|
||||||
|
CoreFun.logging.basicConfig(level=logging.INFO, force=True, format="%(asctime)s %(name)s %(levelname)s: %(message)s", datefmt="%d-%m-%Y %H:%M:%S")
|
||||||
|
logger = CoreFun.logging.getLogger(__name__)
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
stop_event = asyncio.Event()
|
stop_event = asyncio.Event()
|
||||||
@@ -28,7 +30,7 @@ async def main():
|
|||||||
all_bots = []
|
all_bots = []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
DataBase = await CoreFun.init_db()
|
DataBase = await CoreFun.init_db(debug=True)
|
||||||
#await CoreFun.db_migration(DataBase)
|
#await CoreFun.db_migration(DataBase)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@@ -46,17 +48,16 @@ async def main():
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
sup_bot = CoreFun.AdminBot(DataBase, stop_event, task_start = False)
|
sup_bot = CoreFun.AdminBot(DataBase, stop_event, task_start = False)
|
||||||
all_bots = [sup_bot]
|
all_bots = [sup_bot]
|
||||||
|
|
||||||
# Загрузка когов
|
# Загрузка когов
|
||||||
sup_bot.load_extension("cogs.resetsupcommands")
|
sup_bot.load_extension("cogs.resetsupcommands")
|
||||||
#sup_bot.load_extension("cogs.economy")
|
#sup_bot.load_extension("cogs.economy")
|
||||||
sup_bot.load_extension("cogs.designer")
|
#sup_bot.load_extension("cogs.designer")
|
||||||
#sup_bot.load_extension("cogs.roles")
|
#sup_bot.load_extension("cogs.roles")
|
||||||
#sup_bot.load_extension("cogs.admin")
|
#sup_bot.load_extension("cogs.admin")
|
||||||
#sup_bot.load_extension("cogs.rimagochi")
|
sup_bot.load_extension("cogs.rimagochi")
|
||||||
|
|
||||||
# Запуск монитора остановки и ботов
|
# Запуск монитора остановки и ботов
|
||||||
monitor_task = asyncio.create_task(CoreFun.monitor_stop(stop_event, all_bots))
|
monitor_task = asyncio.create_task(CoreFun.monitor_stop(stop_event, all_bots))
|
||||||
@@ -67,9 +68,9 @@ async def main():
|
|||||||
await asyncio.gather(*bot_tasks, monitor_task)
|
await asyncio.gather(*bot_tasks, monitor_task)
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Боты остановлены по запросу пользователя")
|
logger.info("Боты остановлены по запросу пользователя")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"{datetime.datetime.now().strftime('%H:%M:%S %d-%m-%Y')}:: Произошла критическая ошибка: {e}")
|
logger.exception(f"Произошла критическая ошибка")
|
||||||
finally:
|
finally:
|
||||||
|
|
||||||
# Остановка всех ботов
|
# Остановка всех ботов
|
||||||
@@ -78,7 +79,8 @@ async def main():
|
|||||||
if not bot.is_closed():
|
if not bot.is_closed():
|
||||||
await bot.close()
|
await bot.close()
|
||||||
|
|
||||||
await DataBase.close()
|
if DataBase is not None:
|
||||||
|
await DataBase.close()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|||||||
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