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']}
"""