summaryrefslogtreecommitdiff
path: root/main.py
blob: 5ea81d3d37b16aea473f2520bbb3a14c4055a4cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# This file is part of python-cinema-club-bot
# contributed in 2024 by Mikhail Kirillov (~w96k) <w96k@runbox.com>

# To the extent possible under law, the author(s) have dedicated all copyright
# and related and neighboring rights to this software to the public domain
# worldwide. This software is distributed without any warranty.

# You should have received a copy of the CC0 Public Domain Dedication along
# with this software. If not, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>

from telegram import Update, error
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, \
    MessageHandler, filters
from dotenv import load_dotenv
import os
import logging
from rich import inspect

from strings import INVALID_COMMAND, USER_NOT_PROVIDED, USER_ADDED, \
    USER_REMOVED
from utils import context_init
from persistence import Persistence


load_dotenv()

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)


async def about(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text('''
Version 0.0

python-cinema-club-bot is a bot for Telegram specialized for managing cinema club activities. This software is released as Public Domain using CC0 license.

Project information: http://57.129.46.169/trac/wiki/python-cinema-club-bot
Source code: http://57.129.46.169/cgit/python-cinema-club-bot/

Contributed in 2024 by Mikhail Kirillov (~w96k) <w96k@runbox.com>

To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.

You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see:
<http://creativecommons.org/publicdomain/zero/1.0/>

    ''')


async def add(
        update: Update,
        context: ContextTypes.DEFAULT_TYPE
) -> None:
    context_init(context)

    if context.args == []:
        await update.message.reply_text(USER_NOT_PROVIDED)
        raise error.TelegramError(USER_NOT_PROVIDED)

    for user in context.args:
        context.chat_data["users"].append(user)
        await update.message.reply_text(USER_ADDED.format(user=user))

    await update.message.reply_text(context.chat_data)


async def list(
        update: Update,
        context: ContextTypes.DEFAULT_TYPE
) -> None:
    context_init(context)

    await update.message.reply_text(context.chat_data)


async def remove(
        update: Update,
        context: ContextTypes.DEFAULT_TYPE
) -> None:
    context_init(context)

    if context.args == []:
        await update.message.reply_text(USER_NOT_PROVIDED)
        raise error.TelegramError(USER_NOT_PROVIDED)

    for user in context.args:
        if user == "*":
            context.chat_data["users"] = []
            break
        
        context.chat_data["users"].remove(user)
        await update.message.reply_text(USER_REMOVED.format(user=user))

    await update.message.reply_text(context.chat_data)


async def unknown(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await context.bot.send_message(
        chat_id=update.effective_chat.id,
        text=INVALID_COMMAND
    )


if __name__ == "__main__":    
    app = ApplicationBuilder().token(
        os.environ.get("TELEGRAM_TOKEN")
    ).persistence(Persistence).build()

    app.add_handler(CommandHandler("about", about))
    app.add_handler(CommandHandler("add", add))
    app.add_handler(CommandHandler("list", list))
    app.add_handler(CommandHandler("remove", remove))


    app.add_handler(MessageHandler(filters.COMMAND, unknown))

    app.run_polling()