Py.Cafe

snow--/

bnoviirda

Twitch Bot

DocsPricing
  • comenzi_globale/
  • comenzi_mods/
  • jocuri/
  • app.py
  • base.db
  • clasa_si_analizare.py
  • cooldown.py
  • get_user_id.py
  • puncte.py
  • requirements.txt
  • timeout.py
  • variabile_globale.py
app.py
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
import logging, pycafe, os, pytz, requests, json, time
from datetime import datetime
from threading import Thread
from bottle import route, run
import variabile_globale as vg
from clasa_si_analizare import TwitchBot
from get_user_id import get_user_id

# Inițializează loggerul
logger = logging.getLogger("twitch_bot")

def set_env_from_secrets(secret_names):
    for name in secret_names:
        if name in os.environ:
            logger.info(f"Variabila de mediu {name} este deja setată.")
        else:
            try:
                value = pycafe.get_secret(name)
                os.environ[name] = value
                logger.info(f"Variabila de mediu {name} a fost setată din secretul pycafe.")
            except Exception as e:
                logger.error(f"Eroare la obținerea secretului {name} din pycafe: {e}")
                raise SystemExit(f"Lipsește secretul necesar: {name}")

def update_bot_token(new_token: str) -> None:
    os.environ["BOT_ACCESS_TOKEN"] = new_token
    vg.bot_access_token = new_token
    logger.info("BOT_ACCESS_TOKEN a fost actualizat în variabilele de mediu și globale.")

@route("/", method="GET")
def home() -> str:
    return ":)"

if __name__ == "__main__":
    # Configurează logging-ul
    logger.setLevel(logging.INFO)
    console_handler = logging.StreamHandler()
    file_handler = logging.FileHandler("startup-log.txt", mode="a", encoding="utf-8")
    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)

    # Loghează pornirea aplicației
    logger.info("Aplicația a pornit")

    # Lista cu numele secretelor din pycafe
    secret_names = [
        "BOT_ACCESS_TOKEN",
        "BOT_CLIENT_ID",
        "BOT_CLIENT_SECRET",  # Verifică dacă e necesar!
        "BOT_REFRESH_TOKEN",
        "BOT_USERNAME",
        "OWNER"
    ]

    # Setează variabilele de mediu din secrete doar dacă nu sunt deja setate
    set_env_from_secrets(secret_names)

    # Inițializează variabilele globale folosind variabilele de mediu
    vg.initialize()

    # Ping pentru reîmprospătarea tokenului de acces
    refresh_url = f"https://twitchtokengenerator.com/api/refresh/{vg.bot_refresh_token}"

    try:
        response = requests.get(refresh_url, timeout=5)
        if response.status_code == 200:
            data = response.json()
            token = data.get("token")
            if token:
                logger.info("Ping reușit pentru reîmprospătarea tokenului")
                update_bot_token(token)
            else:
                logger.warning("Răspunsul nu conține câmpul «token»")
        else:
            logger.warning(f"Ping eșuat pe refresh token. Cod status: {response.status_code}")
    except requests.exceptions.Timeout:
        logger.error("Ping eșuat: Timeout atins")
    except requests.exceptions.RequestException as exc:
        logger.error(f"Ping eșuat: {exc}")

    # Pornește Bottle într-un thread separat
    Thread(target=lambda: run(host="0.0.0.0", port=3000, quiet=False)).start()

    # Inițializează și pornește botul Twitch
    vg.bot_id = get_user_id(vg.bot_username)
    vg.owner_id = get_user_id(vg.owner)

    bot = TwitchBot(vg.bot_username, vg.bot_client_id, vg.bot_access_token, vg.owner)
    bot.start()