Как стать автором
Обновить

Напиши в ЛС «томат» или же что за «Клан томатов»

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров5.1K

Достаточно часто натыкался на людей с надписью в профиле "напиши в лс томат", и собираюсь открыть занавесу этой игры, нарушая правила!

(при попытке узнать подробнее, я нашёл человека, который утверждает что впервые увидел эту надпись АЖ 10 лет НАЗАД)

К сожалению откуда пошла эта игра уже не отследить, но смысл был в игре, которая будет сама распространяться среди активной и любопытной молодёжи, которую может заинтересовать эта надпись. В эту игру меня втянул программист, которого увидел в чате:

До этого я очень много раз видел таких людей, но не решался написать.

Через некоторое время писать стали и мне, я заражал людей, было весело, но пришла идея:

То есть я собрался перенести эту игру на новый уровень. Бота начал писать на aiogram 31 марта 2023 года из шаблона, что бы не заморачивать с выбором библиотек, а использовать готовый вариант.
Алгоритм работы следующий:

Первому заражённому написали "томат", и он отвечает пользователю готовый текст с реферальной ссылкой. По ссылке пользователя вводит в курс дела, и предлагает добавить себе в профиль ту самую надпись, что бы стать участником игры. Тем самым за каждым инфицированным должен быть заразивший его человек, и строится некая пирамида.

После алгоритма я начал проектировать базу данных:

class User(Model):
    id = fields.BigIntField(pk=True)
    telegram_id = fields.BigIntField()
    name = fields.CharField(max_length=255, default="Unknown")

    refer = fields.BigIntField()
    referrals = fields.JSONField(default=[])
    referral_level = fields.IntField(default=0)

    balance = fields.IntField(default=0)
    awards = fields.JSONField(default=[])

    register_date = fields.DatetimeField(auto_now_add=True)

    confirmed = fields.BooleanField(default=False)

    status = fields.CharField(max_length=255, default="user")
    is_banned = fields.BooleanField(default=False)

Поля баланса и наград были созданы чуть позже как идеи на будущее, но основными были refer - кто заразил, referrals - те, кого пользователь заразил и referral_level - какой по ступени он заражённый (в будущем поломалось, но оно и не пригодилось).

База данных спроектирована, используется SQLite, по поводу функций работы с ней я много заикаться не буду, все дословно переводятся и понятны, из них наверное могут заинтересовать только функции постройки топа:

Скорее всего есть вариант лучше, но в тот момент ничего в голову лучше не пришло, чем сортировка по кол-ву заражённых:

Потом понадобилось сделать проверку наличия "томат" в профиле пользователя, достаточно много было идей как это реализовать, но в итоге решил просто воспользоваться возможность в вебе увидеть профиль пользователя, и простым поисков в html узнать прошёл ли проверку пользователь:

тут я уже растоматился
тут я уже растоматился
html = requests.get(f"https://t.me/{c.from_user.username}").text
user = await User.get_data(c.from_user.id)

if "томат" in html.lower():
  pass

Проверка не 100%ная, человек мог ввести не всю надпись, но чёткая проверка могла отсеить различные интересные правки людей в надпись.

И вот я запустил этого бота, сразу же с мы собрали всех тех, кого заразили и начали выслушивать предложения по улучшениям.

Первым из них стало добавление инлайна, что бы удобно инфицировать:

В него сразу встраивалась реферальная ссылка:

def get_message_article(user: User):
    return InlineQueryResultArticle(
        id="message",
        title="? Сообщение об инфицировании",
        description="? Отправит шаблонное сообщение с вашей ссылкой на бота",
        input_message_content=InputTextMessageContent(
            message_text=f"<b>? Вас инфицировали!</b>\n"
            "ℹ️ Теперь вам необходимо запустить бота и следовать инструкциям.\n"
            f"<b>? Ссылка на бота:</b> <a href='https://t.me/tomatoclanbot?start={user.id}'>https://t.me/tomatoclanbot</a>.",
            disable_web_page_preview=True,
        ),
    )

А вторым добавление того самого баланса и наград, который пока не был реализован до конца, т.к. нет полноценного концепта.

Как итог бот до сих пор работает, на момент написания поста бот работает без обновлений без ошибок уже 152 дня и 10 часов:

На проект суммарно затрачено:

А играет в боте 1000+ человек, из которых всего 300+ кого-то заражают. Считать это успехом или провалом сложно, главное что было весело и интересно!

Ссылка на исходный код

Ссылка на подробные правила игры


Если кому интересно попытаться составить графики из базы данных реферальной пирамиды, пишите мне в телеграм.

Теги:
Хабы:
Всего голосов 8: ↑6 и ↓2+5
Комментарии2

Публикации

Работа

Data Scientist
41 вакансия

Ближайшие события