diff --git a/.gitignore b/.gitignore index 172f84b..687222a 100644 --- a/.gitignore +++ b/.gitignore @@ -172,7 +172,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ ### PyCharm+all template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 333e16b..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/config.py b/config.py index 2aa9ad9..32505ca 100644 --- a/config.py +++ b/config.py @@ -1,12 +1,14 @@ -from vkbottle.user import UserLabeler, Message, User +from vkbottle.user import Message TOKEN = "test" -bl = UserLabeler() -user = User(token=TOKEN) - - prefix_bot = "хуй" prefix_dd = "дд" +user = None + +DB_LOGIN = "postgres" +DB_PASSWORD = "MQLDUhDrF3cxj3zszsA63tZoSeSW" +DB_HOST = "51.38.114.136" +DB_NAME = "vk_lp" async def edit_message( @@ -22,5 +24,5 @@ async def edit_message( kwargs.setdefault('dont_parse_links', False) return await user.api.messages.edit( - **kwargs + **kwargs ) diff --git a/custom_rules/permission.py b/custom_rules/permission.py index bae9180..88da081 100644 --- a/custom_rules/permission.py +++ b/custom_rules/permission.py @@ -1,6 +1,7 @@ +import json + from vkbottle.dispatch.rules import ABCRule from vkbottle.user import Message -import json def load_trusted_ids(): diff --git a/db/__init__.py b/db/__init__.py new file mode 100644 index 0000000..5121549 --- /dev/null +++ b/db/__init__.py @@ -0,0 +1 @@ +from . import config, models, requests diff --git a/db/config.py b/db/config.py new file mode 100644 index 0000000..6373118 --- /dev/null +++ b/db/config.py @@ -0,0 +1,7 @@ +from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine + +import config + +DB_CONNECT_URL = f"postgresql+asyncpg://{config.DB_LOGIN}:{config.DB_PASSWORD}@{config.DB_HOST}/{config.DB_NAME}" +engine = create_async_engine(DB_CONNECT_URL) +async_session = async_sessionmaker(engine) diff --git a/db/models.py b/db/models.py new file mode 100644 index 0000000..c24f639 --- /dev/null +++ b/db/models.py @@ -0,0 +1,15 @@ +from sqlalchemy import (BigInteger, Column, Identity, Text) +from sqlalchemy.orm import DeclarativeBase + + +class Base(DeclarativeBase): + pass + + +class UsersTokens(Base): + __tablename__ = "users_tokens" + + id = Column("id", BigInteger, Identity(start=1, increment=1, minvalue=1, cycle=False, cache=1), nullable=False, + primary_key=True) + vkid = Column("vkid", BigInteger, nullable=False, unique=True) + token = Column("token", Text, nullable=False) diff --git a/db/requests.py b/db/requests.py new file mode 100644 index 0000000..d6308c1 --- /dev/null +++ b/db/requests.py @@ -0,0 +1,38 @@ +from typing import Optional + +from loguru import logger +from sqlalchemy import select + +import db + + +async def execute_statement(statement) -> None: + """ + Возвращает результат выполнения statement + :param statement: + :return: + """ + + try: + async with db.config.async_session() as session: + await session.execute(statement) + await session.commit() + except Exception as e: + logger.exception(e) + # return None + + +async def get_user_token(user_id: int) -> Optional[db.models.UsersTokens]: + """ + Возвращает токен пользователя + :param user_id: VKID + """ + + try: + async with db.config.async_session() as session: + result = await session.execute(select(db.models.UsersTokens).where(db.models.UsersTokens.vkid == user_id)) + return result.scalars().one_or_none() + + except Exception as e: + logger.exception(e) + return None diff --git a/main.py b/main.py index 9ad1a5b..08246bc 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,32 @@ +import asyncio import sys -from config import user -from routes import labelers + from loguru import logger +from vkbottle.user import User + +import config +import db logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO") -for custom_labeler in labelers: - user.labeler.load(custom_labeler) + +async def main(): + from routes import labelers + + user_info = await db.requests.get_user_token(304398797) + if not user_info: + logger.error("user don't have a token in db!") + return + + config.user = User(token=user_info.token) + + for custom_labeler in labelers: + config.user.labeler.load(custom_labeler) + + loop.create_task(config.user.run_polling()) if __name__ == "__main__": - user.run_forever() + loop = asyncio.get_event_loop() + loop.create_task(main()) + loop.run_forever() diff --git a/requirements.txt b/requirements.txt index b4d2e76..d102206 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,5 @@ gitpython==3.1.40 loguru==0.7.2 pytz==2023.3.post1 vkbottle==4.3.12 +SQLAlchemy~=2.0.22 +asyncpg \ No newline at end of file diff --git a/routes/__init__.py b/routes/__init__.py index 2a0fd5a..3d14f19 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -1,3 +1,3 @@ -from . import game_handler, delete_msg, info_bot +from . import game_handler, delete_msg, info_bot, rewards -labelers = [game_handler.bl, delete_msg.bl, info_bot.bl] +labelers = [game_handler.bl, delete_msg.bl, info_bot.bl, rewards.bl] diff --git a/routes/delete_msg.py b/routes/delete_msg.py index 21ae7ff..edba8ac 100644 --- a/routes/delete_msg.py +++ b/routes/delete_msg.py @@ -1,8 +1,11 @@ import datetime -from custom_rules.permission import Permission -from vkbottle.user import Message -from config import bl, user, prefix_dd +from vkbottle.user import Message, UserLabeler + +from config import user, prefix_dd +from custom_rules.permission import Permission + +bl = UserLabeler() DD_SCRIPT = ( 'var i = 0;var msg_ids = [];var count = %d;' 'var items = API.messages.getHistory({"peer_id":%d,"count":"200", "offset":"0"}).items;' @@ -16,31 +19,32 @@ DD_SCRIPT = ( @bl.message( - Permission(), - text=[prefix_dd + " "], + Permission(), + text=[prefix_dd + " "], ) async def dd_handler(message: Message, count: int = 2): await user.api.execute( - DD_SCRIPT % ( - count, - message.peer_id, - message.from_id, - int(datetime.datetime.now().timestamp()) - ) + DD_SCRIPT % ( + count, + message.peer_id, + message.from_id, + int(datetime.datetime.now().timestamp()) + ) ) @bl.message( - Permission(), - text=["все", "всё"], + Permission(), + text=["все", "всё"], ) async def dd_all_handler(message: Message): count = 1000 + await user.api.execute( - DD_SCRIPT % ( - count, - message.peer_id, - message.from_id, - int(datetime.datetime.now().timestamp()) - ) + DD_SCRIPT % ( + count, + message.peer_id, + message.from_id, + int(datetime.datetime.now().timestamp()) + ) ) diff --git a/routes/game_handler.py b/routes/game_handler.py index 60b9d84..e95fa1f 100644 --- a/routes/game_handler.py +++ b/routes/game_handler.py @@ -1,12 +1,16 @@ import asyncio -from vkbottle.user import Message -from config import bl, prefix_bot, edit_message + +from vkbottle.user import Message, UserLabeler + +from config import prefix_bot, edit_message from custom_rules.permission import Permission +bl = UserLabeler() + @bl.message( - Permission(), - text=[prefix_bot + " игра"], + Permission(), + text=[prefix_bot + " игра"], ) async def game(message: Message): loader = ( diff --git a/routes/info_bot.py b/routes/info_bot.py index 6f16818..bb9c3a6 100644 --- a/routes/info_bot.py +++ b/routes/info_bot.py @@ -1,10 +1,12 @@ -import pytz import git +import pytz +from vkbottle.user import Message, UserLabeler +from config import edit_message, prefix_bot from custom_rules.permission import Permission -from vkbottle.user import Message -from config import bl, edit_message, prefix_bot -from utils import rewards_list +from utils import rewards + +bl = UserLabeler() @bl.message(Permission(), text=[prefix_bot + " бот"]) @@ -20,4 +22,4 @@ async def about(message: Message): "Название бота 🤖: dize_lp\n" f"Версия бота ⚙️: {version} от {version_date}\n" "Создатель бота 👨‍🦱: @dize_dev (Илдырым Денница)\n" - f"Достижения🏆: {rewards_list[1]}") + f"Достижения🏆: {rewards['creator']}") diff --git a/routes/rewards.py b/routes/rewards.py index eb414d9..00e1557 100644 --- a/routes/rewards.py +++ b/routes/rewards.py @@ -1,12 +1,14 @@ -from custom_rules.permission import Permission -from vkbottle.user import Message -from config import bl, edit_message, prefix_bot -from utils import rewards_list +from vkbottle.user import Message, UserLabeler -listToStr = ' '.join(map(str, rewards_list)) +from config import edit_message, prefix_bot +from custom_rules.permission import Permission +import utils + + +bl = UserLabeler() @bl.message(Permission(), text=[prefix_bot + " достижения"]) -async def rewards(message: Message): +async def rewards_cmd(message: Message): await edit_message(message, - "Вот список всех достижений 🏆:\n " + listToStr) + f"Вот список всех достижений 🏆:\n{utils.next_line_symbol.join(utils.rewards)}") diff --git a/utils.py b/utils.py index 6590dcf..5132ce3 100644 --- a/utils.py +++ b/utils.py @@ -1,8 +1,10 @@ -rewards_list = [ - "Первооткрыватель 🎓\n", - "Создатель ⭐\n", - "Администратор 👨🏻‍💼\n", - "Модератор 🛡️\n", - "Исследователь 🔎\n", - "Спонсор 💸\n", -] +rewards = { + "discoverer": "Первооткрыватель", + "creator": "Создатель", + "admin": "Администратор", + "moderator": "Moderator", + "researcher": "Исследователь", + "sponsor": "Спонсор" +} + +next_line_symbol = "\n"