diff --git a/alembic/versions/1b1f99b95b38_add_permissions.py b/alembic/versions/1b1f99b95b38_add_permissions.py new file mode 100644 index 0000000..ff8083e --- /dev/null +++ b/alembic/versions/1b1f99b95b38_add_permissions.py @@ -0,0 +1,24 @@ +"""add permissions + +Revision ID: 1b1f99b95b38 +Revises: 9d160884887c +Create Date: 2023-07-30 18:33:35.400071 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1b1f99b95b38' +down_revision = '9d160884887c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/commands/donation.py b/app/commands/donation.py deleted file mode 100644 index d25a2f8..0000000 --- a/app/commands/donation.py +++ /dev/null @@ -1,28 +0,0 @@ -from telebot.types import LabeledPrice, Message, PreCheckoutQuery -from ..config import YOOPAY, bot - -prices = [LabeledPrice("Сумма", 100_00)] - - -@bot.message_handler(commands=["donate"]) -def request_invoice(message: Message): - bot.send_invoice( - message.chat.id, - "Поддержать проект", - "Stan", - "donate_stan", - provider_token=YOOPAY, - currency="RUB", - prices=prices, - provider_data='{"capture": true}', - max_tip_amount=500_000_00, - suggested_tip_amounts=[150_00, 300_00, 500_00, 1_000_00], - capture=True, - ) - - -@bot.pre_checkout_query_handler(func=lambda a: True) -def process_pre_checkout(q: PreCheckoutQuery): - bot.answer_pre_checkout_query( - q.id, True, "Извините, пожертвования больше не принимаем!" - ) diff --git a/app/commands/service.py b/app/commands/service.py index 35584ff..b9fd3d8 100644 --- a/app/commands/service.py +++ b/app/commands/service.py @@ -3,7 +3,7 @@ import logging from telebot import logger from datetime import datetime as dt -from ..models import Chat, Quote +from ..models import Chat, Quote, User from ..database import session from ..config import bot, ADMIN_ID, types from .. import reminder @@ -193,3 +193,24 @@ def set_logging_level(message: types.Message): else: logger.setLevel(20) # INFO logging.info("[LEVEL] Установлен уровень INFO") + + +@bot.message_handler(func=is_admin, commands="promote", chat_types=["supergroup", "group"]) +def promote_user(message: types.Message): + if message.reply_to_message: + user = message.reply_to_message.from_user + + user_db = session.query(User).filter_by(tg_id=user.id) + if not user_db: + permission = 1 + session.add(tg_id=user.id, + first_name=user.first_name, + last_name=user.last_name, + username=user.username, + permissions=permission) + else: + permission = user_db.permission * 2 + user_db.update(permissions=permission) + session.commit() + + logger.info(f'[{user.first_name} {user.last_name}] повышен до {permission}.') \ No newline at end of file diff --git a/app/config.py b/app/config.py index 2e4b0fd..eefd0d7 100644 --- a/app/config.py +++ b/app/config.py @@ -80,7 +80,7 @@ FAQ = types.InlineKeyboardButton( LIB = types.InlineKeyboardButton("📚 Книги", url="https://telegra.ph/what-to-read-10-06") SPAM = ["me.sv/", "tg.sv/", "goo.by/", "go.sv/", "intim.video/", "uclck.ru/", 'раб0т', - '0плат', ] + '0плат', 'Жду в ЛС!', 'новый способ заработка', 'криптовалют'] NON_GRATA = ["дудар", "хауди", "dudar"] BAN_WORDS = ["GREEN"] diff --git a/app/filters.py b/app/filters.py index 45c91d6..af2b765 100644 --- a/app/filters.py +++ b/app/filters.py @@ -7,12 +7,11 @@ def in_spam_list(message: types.Message) -> bool: """Check for mentioning unwanted persons in text.""" antispam_is_enabled = session.query(Chat.antispam).filter_by(chat_id=message.chat.id).first()[0] if message.from_user.id not in WHITEIDS and antispam_is_enabled: - for url in SPAM: - if url in message.text.casefold(): + for text in SPAM: + if text in message.text.casefold(): logging.info( "!BAN!" + LOG_COMM % ( message.chat.title, message.from_user.id, message.from_user.first_name, message.text)) - return True diff --git a/app/models.py b/app/models.py index d1cbe1c..cf94eea 100644 --- a/app/models.py +++ b/app/models.py @@ -1,8 +1,17 @@ from sqlalchemy import Column, String, Integer, Boolean, ForeignKey from sqlalchemy.orm import relationship, declarative_base +from .database import session + Base = declarative_base() +class Permission: + USE_COMMANDS = 1 # Пользоваться обычными командами. + SEND_LINKS = 2 # Может отправлять ссылки без удаления. + MODIFY_QUOTES = 4 # Может добавлять и удалять цитаты. + MODERATE = 8 + ADMIN = 16 # Может банить юзеров и удалять сообщения. + class Quote(Base): __tablename__ = "quotes" @@ -25,6 +34,65 @@ class Chat(Base): antispam = Column(Boolean) report = Column(Boolean) reminder = Column(Boolean) + hidden = Column(Boolean) def __repr__(self): return f'Chat({self.chat_id=}, {self.title=})' + + +class User(Base): + __tablename__ = "users" + id = Column(Integer, primary_key=True) + tg_id = Column(Integer, unique=True) + first_name = Column(String) + last_name = Column(String) + username = Column(String) + permissions = Column(Integer) + + def __repr__(self): + return f'User({self.first_name} {self.last_name} {self.username})' + +class Role(Base): + __tablename__ = 'roles' + id = Column(Integer, primary_key=True) + name = Column(String(64), unique=True) + default = Column(Boolean, default=False, index=True) + permissions = Column(Integer) + users = relationship('User', backref='role', lazy='dynamic') + + def add_permission(self, perm): + if not self.has_permission(perm): + self.permissions += perm + + def remove_permission(self, perm): + if self.has_permission(perm): + self.permissions -= perm + + def reset_permissions(self): + self.permissions = 0 + + def has_permission(self, perm): + return self.permissions & perm == perm + + + @staticmethod + def insert_roles(): + roles = { + "User": [Permission.USE_COMMANDS], + "Moderator": [Permission.USE_COMMANDS, Permission.SEND_LINKS, + Permission.MODIFY_QUOTES, Permission.MODERATE], + "Administrator": [Permission.USE_COMMANDS, Permission.SEND_LINKS, + Permission.MODIFY_QUOTES, Permission.MODERATE, + Permission.ADMIN], + } + default_role = 'User' + for r in roles: + role = Role.query.filter_by(name=r).first() + if role is None: + role = Role(name=r) + role.reset_permissions() + for perm in roles[r]: + role.add_permission(perm) + role.default = (role.name == default_role) + session.add(role) + session.commit() \ No newline at end of file diff --git a/app/report.py b/app/report.py index 9b9ccbb..01c26e7 100644 --- a/app/report.py +++ b/app/report.py @@ -31,15 +31,15 @@ def create_report_text(chat_id): if user.last_name else user.first_name ) - top_users += f'\n {i + 1}. {name} [{flooder["Count"]}]' + top_users += f'\n{i + 1}. {name} [{flooder["Count"]}]' if len(flooders) >= 3 or s["Banned"] or s["Deleted"]: - report = f"Hello, World!\n" + report = f"Hello, World!\n" if len(flooders) >= 3: - report += f"\nТоп 🐍{top_users}\n" + report += f"\n{top_users}\n" if s["Banned"] or s["Deleted"]: report += f""" -Заблокировано +Удалено ├ Пользователей: {s['Banned']} └ Сообщений: {s['Deleted']} """