mirror of
https://github.com/rangermix/TwitchDropsMiner.git
synced 2026-06-03 02:49:38 +00:00
Remove channel points handling
This commit is contained in:
21
channel.py
21
channel.py
@@ -133,7 +133,6 @@ class Channel:
|
||||
self.id: int = int(id)
|
||||
self._login: str = login
|
||||
self._display_name: str | None = display_name
|
||||
self.points: int | None = None
|
||||
self._stream: Stream | None = None
|
||||
self._pending_stream_up: asyncio.Task[Any] | None = None
|
||||
# ACL-based channels are:
|
||||
@@ -355,26 +354,6 @@ class Channel:
|
||||
if needs_display:
|
||||
self.display()
|
||||
|
||||
async def claim_bonus(self):
|
||||
"""
|
||||
This claims bonus points if they're available, and fills out the 'points' attribute.
|
||||
"""
|
||||
response: JsonType = await self._twitch.gql_request(
|
||||
GQL_OPERATIONS["ChannelPointsContext"].with_variables({"channelLogin": self._login})
|
||||
)
|
||||
channel_data: JsonType = response["data"]["community"]["channel"]
|
||||
self.points = channel_data["self"]["communityPoints"]["balance"]
|
||||
claim_available: JsonType = (
|
||||
channel_data["self"]["communityPoints"]["availableClaim"]
|
||||
)
|
||||
if claim_available:
|
||||
await self._twitch.claim_points(channel_data["id"], claim_available["id"])
|
||||
logger.info("Claimed bonus points")
|
||||
else:
|
||||
# calling 'claim_points' is going to refresh the display via the websocket payload,
|
||||
# so if we're not calling it, we need to do it ourselves
|
||||
self.display()
|
||||
|
||||
async def send_watch(self) -> bool:
|
||||
"""
|
||||
This performs a HEAD request on the stream's current playlist,
|
||||
|
||||
@@ -113,7 +113,7 @@ URLType = NewType("URLType", str)
|
||||
TopicProcess: TypeAlias = "abc.Callable[[int, JsonType], Any]"
|
||||
# Values
|
||||
MAX_INT = sys.maxsize
|
||||
BASE_TOPICS = 3
|
||||
BASE_TOPICS = 2
|
||||
MAX_WEBSOCKETS = 8
|
||||
WS_TOPICS_LIMIT = 50
|
||||
TOPICS_PER_CHANNEL = 2
|
||||
|
||||
29
gui.py
29
gui.py
@@ -820,7 +820,6 @@ class ConsoleOutput:
|
||||
class _Buttons(TypedDict):
|
||||
frame: ttk.Frame
|
||||
switch: ttk.Button
|
||||
load_points: ttk.Button
|
||||
|
||||
|
||||
class ChannelList:
|
||||
@@ -841,13 +840,9 @@ class ChannelList:
|
||||
state="disabled",
|
||||
command=manager._twitch.state_change(State.CHANNEL_SWITCH),
|
||||
),
|
||||
"load_points": ttk.Button(
|
||||
buttons_frame, text=_("gui", "channels", "load_points"), command=self._load_points
|
||||
),
|
||||
}
|
||||
buttons_frame.grid(column=0, row=0, columnspan=2)
|
||||
self._buttons["switch"].grid(column=0, row=0)
|
||||
self._buttons["load_points"].grid(column=1, row=0)
|
||||
scroll = ttk.Scrollbar(frame, orient="vertical")
|
||||
self._table = table = ttk.Treeview(
|
||||
frame,
|
||||
@@ -880,9 +875,6 @@ class ChannelList:
|
||||
self._add_column(
|
||||
"viewers", _("gui", "channels", "headings", "viewers"), width_template="1234567"
|
||||
)
|
||||
self._add_column(
|
||||
"points", _("gui", "channels", "headings", "points"), width_template="1234567"
|
||||
)
|
||||
self._add_column("acl_base", "📋", width_template="✔")
|
||||
self._channel_map: dict[str, Channel] = {}
|
||||
|
||||
@@ -937,11 +929,6 @@ class ChannelList:
|
||||
else:
|
||||
self._buttons["switch"].config(state="disabled")
|
||||
|
||||
def _load_points(self):
|
||||
# disable the button afterwards
|
||||
self._buttons["load_points"].config(state="disabled")
|
||||
asyncio.gather(*(ch.claim_bonus() for ch in self._manager._twitch.channels.values()))
|
||||
|
||||
def _measure(self, text: str) -> int:
|
||||
# we need this because columns have 9-10 pixels of padding that cuts text off
|
||||
return self._font.measure(text) + 10
|
||||
@@ -1038,18 +1025,12 @@ class ChannelList:
|
||||
viewers = ''
|
||||
if channel.viewers is not None:
|
||||
viewers = str(channel.viewers)
|
||||
# points
|
||||
points = ''
|
||||
if channel.points is not None:
|
||||
points = str(channel.points)
|
||||
if iid in self._channel_map:
|
||||
self._set(iid, "game", game)
|
||||
self._set(iid, "drops", drops)
|
||||
self._set(iid, "status", status)
|
||||
self._set(iid, "viewers", viewers)
|
||||
self._set(iid, "acl_base", acl_based)
|
||||
if points != '': # we still want to display 0
|
||||
self._set(iid, "points", points)
|
||||
elif add:
|
||||
self._channel_map[iid] = channel
|
||||
self._insert(
|
||||
@@ -1057,7 +1038,6 @@ class ChannelList:
|
||||
{
|
||||
"game": game,
|
||||
"drops": drops,
|
||||
"points": points,
|
||||
"status": status,
|
||||
"viewers": viewers,
|
||||
"acl_base": acl_based,
|
||||
@@ -2320,7 +2300,6 @@ if __name__ == "__main__":
|
||||
game: str | None,
|
||||
drops: bool,
|
||||
viewers: int,
|
||||
points: int,
|
||||
acl_based: bool,
|
||||
):
|
||||
# status: 0 -> OFFLINE, 1 -> PENDING_ONLINE, 2 -> ONLINE
|
||||
@@ -2337,7 +2316,6 @@ if __name__ == "__main__":
|
||||
return SimpleNamespace(
|
||||
name=name,
|
||||
iid=(iid := iid + 1),
|
||||
points=points,
|
||||
online=bool(status),
|
||||
pending_online=pending,
|
||||
game=game_obj,
|
||||
@@ -2374,7 +2352,7 @@ if __name__ == "__main__":
|
||||
expired=False,
|
||||
active=False,
|
||||
upcoming=True,
|
||||
linked=False,
|
||||
eligible=False,
|
||||
finished=False,
|
||||
link_url="https://google.com",
|
||||
image_url="https://static-cdn.jtvnw.net/ttv-boxart/460630-285x380.jpg",
|
||||
@@ -2449,13 +2427,12 @@ if __name__ == "__main__":
|
||||
game=None,
|
||||
drops=False,
|
||||
viewers=0,
|
||||
points=0,
|
||||
acl_based=True,
|
||||
),
|
||||
add=True,
|
||||
)
|
||||
channel = create_channel(
|
||||
name="Traitus", status=1, game=None, drops=False, viewers=0, points=0, acl_based=True
|
||||
name="Traitus", status=1, game=None, drops=False, viewers=0, acl_based=True
|
||||
)
|
||||
gui.channels.display(channel, add=True)
|
||||
gui.channels.set_watching(channel)
|
||||
@@ -2466,7 +2443,6 @@ if __name__ == "__main__":
|
||||
game="Best Game",
|
||||
drops=True,
|
||||
viewers=42,
|
||||
points=1234567,
|
||||
acl_based=False,
|
||||
),
|
||||
add=True,
|
||||
@@ -2478,7 +2454,6 @@ if __name__ == "__main__":
|
||||
game="Best Game",
|
||||
drops=True,
|
||||
viewers=69,
|
||||
points=1234567,
|
||||
acl_based=False,
|
||||
),
|
||||
add=True,
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} går ONLINE, skifter...",
|
||||
"goes_offline": "{channel} går OFFLINE, skifter...",
|
||||
"claimed_drop": "Hentet belønning: {drop}",
|
||||
"claimed_points": "Hentet ekstra points: {points}",
|
||||
"earned_points": "Optjente point for at se: {points}, Total: {balance}",
|
||||
"no_channel": "Ingen tilgængelige kanaler at se. Venter på en ONLINE kanal...",
|
||||
"no_campaign": "Der er ingen aktive kampagner at hente. Venter på en aktiv kampagne..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Kanaler",
|
||||
"switch": "Skift",
|
||||
"load_points": "Indlæs Points",
|
||||
"online": "ONLINE \u2714",
|
||||
"pending": "OFFLINE \u23f3",
|
||||
"offline": "OFFLINE \u274c",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Kanal",
|
||||
"status": "Status",
|
||||
"game": "Spil",
|
||||
"viewers": "Seere",
|
||||
"points": "Points"
|
||||
"viewers": "Seere"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} ist ONLINE gegangen, wechseln...",
|
||||
"goes_offline": "{channel} ist OFFLINE gegangen, wechseln...",
|
||||
"claimed_drop": "Drop abgeholt: {drop}",
|
||||
"claimed_points": "Kanal-Punkte verdient: {points}",
|
||||
"earned_points": "Verdiente Kanal-Punkte fürs zuschauen: {points} | Summe: {balance}",
|
||||
"no_channel": "Keine teilnehmenden Kanäle online. Warten auf Kanäle...",
|
||||
"no_campaign": "Keine aktiven Kampagnen verfügbar. Warten auf neue Kampagne..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Kanäle",
|
||||
"switch": "Wechseln",
|
||||
"load_points": "Lade Punkte",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Kanal",
|
||||
"status": "Status",
|
||||
"game": "Spiel",
|
||||
"viewers": "Zuschauer",
|
||||
"points": "Punkte"
|
||||
"viewers": "Zuschauer"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "El canal {channel} se ha conectado, cambiando...",
|
||||
"goes_offline": "El canal {channel} se ha desconectado, cambiando...",
|
||||
"claimed_drop": "Drop reclamado: {drop}",
|
||||
"claimed_points": "Recompensa de puntos reclamados: {points}",
|
||||
"earned_points": "Puntos obtenidos por mirar el stream: {points} | Total: {balance}",
|
||||
"no_channel": "No se ha encontrado un canal en vivo para mirar. \nEsperando un canal en vivo...",
|
||||
"no_campaign": "No se ha encontrado una campaña activa. \nEsperando una nueva campaña..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Canales",
|
||||
"switch": "Cambiar",
|
||||
"load_points": "Cargar Puntos",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Canal",
|
||||
"status": "Estado",
|
||||
"game": "Juego",
|
||||
"viewers": "Espectadores",
|
||||
"points": "Puntos"
|
||||
"viewers": "Espectadores"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} passe EN LIGNE, changement...",
|
||||
"goes_offline": "{channel} passe HORS LIGNE, changement...",
|
||||
"claimed_drop": "Drop récupéré : {drop}",
|
||||
"claimed_points": "Points bonus récupéré : {points}",
|
||||
"earned_points": "Points gagnés pour avoir regardé : {points}, total : {balance}",
|
||||
"no_channel": "Aucune chaîne disponible à regarder. En attente d'une chaîne EN LIGNE...",
|
||||
"no_campaign": "Aucune campagne active pour laquelle miner des drops. En attente d'une campagne active..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Chaînes",
|
||||
"switch": "Basculer",
|
||||
"load_points": "Charger des Points",
|
||||
"online": "EN LIGNE ✔",
|
||||
"pending": "HORS LIGNE ⏳",
|
||||
"offline": "HORS LIGNE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Chaîne",
|
||||
"status": "Statut",
|
||||
"game": "Jeu",
|
||||
"viewers": "Spectateurs",
|
||||
"points": "Points"
|
||||
"viewers": "Spectateurs"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} Tiket masuk ONLINE, ganti...",
|
||||
"goes_offline": "{channel} menjadi OFF-LINE, ubah...",
|
||||
"claimed_drop": "Drop dipulihkan : {drop}",
|
||||
"claimed_points": "Poin bonus yang dipulihkan: {points}",
|
||||
"earned_points": "Poin yang diperoleh dari menonton : {points}, jumlah : {balance}",
|
||||
"no_channel": "Tidak ada saluran yang tersedia untuk ditonton. Menunggu saluran secara ONLINE...",
|
||||
"no_campaign": "Tidak ada kampanye aktif yang bisa ditambang. Menunggu kampanye aktif..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Saluran",
|
||||
"switch": "Beralih",
|
||||
"load_points": "Poin Pemuatan",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "DITUNDA ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Saluran",
|
||||
"status": "Status",
|
||||
"game": "Game",
|
||||
"viewers": "Penonton",
|
||||
"points": "Poin"
|
||||
"viewers": "Penonton"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} è ONLINE, cambiando...",
|
||||
"goes_offline": "{channel} è OFFLINE, cambiando...",
|
||||
"claimed_drop": "Contenuti riscattati: {drop}",
|
||||
"claimed_points": "Punti bonus riscattati: {points}",
|
||||
"earned_points": "Punti bonus guadagnati per aver guardato la stream: {points}, totale: {balance}",
|
||||
"no_channel": "Nessun canale disponibile da guardare. In attesa di un canale ONLINE...",
|
||||
"no_campaign": "Nessuna campagna attiva per ottenere i premi. In attesa di una campagna attiva..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Canali",
|
||||
"switch": "Cambia",
|
||||
"load_points": "Carica Punti",
|
||||
"online": "ONLINE \u2714",
|
||||
"pending": "OFFLINE \u23f3",
|
||||
"offline": "OFFLINE \u274c",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Canale",
|
||||
"status": "Stato",
|
||||
"game": "Gioco",
|
||||
"viewers": "Spettatori",
|
||||
"points": "Punti"
|
||||
"viewers": "Spettatori"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} is ONLINE gegaan, wijzig...",
|
||||
"goes_offline": "{channel} is OFFLINE gegaan, wijzig...",
|
||||
"claimed_drop": "Drop verkregen: {drop}",
|
||||
"claimed_points": "Kanaal punten verdient: {points}",
|
||||
"earned_points": "Verdiende kanaalpunten voor het kijken: {points} | Totaal: {balance}",
|
||||
"no_channel": "Geen deelnemende kanalen online. Wachten op steamers...",
|
||||
"no_campaign": "Geen actieve campagnes beschikbaar. Wachten op nieuwe campagne..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Kanaal",
|
||||
"switch": "Wisselen",
|
||||
"load_points": "Laad Punten",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Kanaal",
|
||||
"status": "Status",
|
||||
"game": "Spel",
|
||||
"viewers": "Kijkers",
|
||||
"points": "Punten"
|
||||
"viewers": "Kijkers"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "Nowy status kanału {channel}: ONLINE, zmieniam...",
|
||||
"goes_offline": "Nowy status kanału {channel}: OFFLINE, zmieniam...",
|
||||
"claimed_drop": "Odebrano drop: {drop}",
|
||||
"claimed_points": "Odebrano punkty: {points}",
|
||||
"earned_points": "Zdobyto punkty za oglądanie: {points} | Łącznie: {balance}",
|
||||
"no_channel": "Brak możliwych kanałów do oglądania. Oczekiwanie na nową kampanię...",
|
||||
"no_campaign": "Brak dostępnych aktywnych kampanii. Oczekiwanie na nową kampanię..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Kanały",
|
||||
"switch": "Zmień",
|
||||
"load_points": "Załaduj punkty",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "W TOKU ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Kanał",
|
||||
"status": "Status",
|
||||
"game": "Gra",
|
||||
"viewers": "Widzowie",
|
||||
"points": "Punkty"
|
||||
"viewers": "Widzowie"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} esta ONLINE, Mudando...",
|
||||
"goes_offline": "{channel} ficou OFFLINE, Mudando...",
|
||||
"claimed_drop": "Coletou o drop: {drop}",
|
||||
"claimed_points": "Coletou o bonus: {points}",
|
||||
"earned_points": "Ganhou este valor de pontos: {points}, total: {balance}",
|
||||
"no_channel": "Sem canal disponivel para assisitir. Esperando por um canal ONLINE...",
|
||||
"no_campaign": "Sem campanhas ativas no momento para minerar. Esperando por uma campanha ativa..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Canais",
|
||||
"switch": "Trocar",
|
||||
"load_points": "Carregar pontos",
|
||||
"online": "ONLINE \u2714",
|
||||
"pending": "OFFLINE \u23f3",
|
||||
"offline": "OFFLINE \u274c",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Canal",
|
||||
"status": "Status",
|
||||
"game": "Jogo",
|
||||
"viewers": "Visualizadores",
|
||||
"points": "Pontos"
|
||||
"viewers": "Visualizadores"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} intră ONLINE, se schimbă...",
|
||||
"goes_offline": "{channel} intră OFFLINE, se schimbă...",
|
||||
"claimed_drop": "Drop-ul a fost recuperat : {drop}",
|
||||
"claimed_points": "Puncte bonus colectate : {points}",
|
||||
"earned_points": "Puncte câștigate pentru vizionare: {points}, totale : {balance}",
|
||||
"no_channel": "Nu există canale disponibile pentru vizionare. În așteptarea unui canal ONLINE...",
|
||||
"no_campaign": "Nu există campanii active pentru a mina drop-uri. În așteptarea unei campanii active..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Canale",
|
||||
"switch": "Schimbă",
|
||||
"load_points": "Încarcă puncte",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Canal",
|
||||
"status": "Statut",
|
||||
"game": "Joc",
|
||||
"viewers": "Spectatori",
|
||||
"points": "Puncte"
|
||||
"viewers": "Spectatori"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} ÇEVRİMİÇİ oldu, geçiş yapın...",
|
||||
"goes_offline": "{channel} ÇEVRİMDIŞI duruma geçti, geçiş yapın...",
|
||||
"claimed_drop": "Alınan drop: {drop}",
|
||||
"claimed_points": "Kazanılan kanal puanları: {points}",
|
||||
"earned_points": "İzleme karşılığında kazanılan kanal puanları: {points} | Toplam: {balance}",
|
||||
"no_channel": "Çevrimiçi katılımcı kanal yok. Kanallar bekleniyor...",
|
||||
"no_campaign": "Etkin kampanya yok. Yeni kampanya bekleniyor..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Kanallar",
|
||||
"switch": "Değiştir",
|
||||
"load_points": "Puanları Yükle",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Kanal",
|
||||
"status": "Durum",
|
||||
"game": "Oyun",
|
||||
"viewers": "İzleyici",
|
||||
"points": "Puan"
|
||||
"viewers": "İzleyici"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "Kanál {channel} je online, přepínám...",
|
||||
"goes_offline": "Kanál {channel} je offline, přepínám na další...",
|
||||
"claimed_drop": "Drop vyzvednut: {drop}",
|
||||
"claimed_points": "Vyzvednuto {points} bodů",
|
||||
"earned_points": "Získáno {points} bodů za sledování. Celkem: {balance}",
|
||||
"no_channel": "Žádný kanál není dostupný, čekání na další...",
|
||||
"no_campaign": "Žádné dropy k dispozici, čekání na další dostupné dropy..."
|
||||
},
|
||||
@@ -85,14 +83,12 @@
|
||||
"channels": {
|
||||
"name": "Název",
|
||||
"switch": "Přepnout",
|
||||
"load_points": "Načíst body",
|
||||
"online": "ONLINE \u2714",
|
||||
"pending": "PRŮBĚH \u23f3",
|
||||
"offline": "OFFLINE \u274c",
|
||||
"headings": {
|
||||
"channel": "Kanál",
|
||||
"game": "Hra",
|
||||
"points": "Body",
|
||||
"status": "Status",
|
||||
"viewers": "Diváci"
|
||||
}
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "Изменение: {channel} онлайн",
|
||||
"goes_offline": "Изменение: {channel} онлайн",
|
||||
"claimed_drop": "Drop получено: {drop}",
|
||||
"claimed_points": "Получены очки канала: {points}",
|
||||
"earned_points": "За просмотр начисляются очки канала: {points} | Сумма: {balance}",
|
||||
"no_channel": "Нет участвующих каналов онлайн. Ожидание каналов...",
|
||||
"no_campaign": "Нет участвующих кампаний онлайн. Ожидание кампаний..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Каналы",
|
||||
"switch": "Изменить",
|
||||
"load_points": "Загрузить баллы",
|
||||
"online": "ОНЛАЙН ✔",
|
||||
"pending": "ОЖИДАНИЕ ⏳",
|
||||
"offline": "ОФЛАЙН ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Канал",
|
||||
"status": "Статус",
|
||||
"game": "Игра",
|
||||
"viewers": "Зрители",
|
||||
"points": "Баллы"
|
||||
"viewers": "Зрители"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} онлайн, зміна...",
|
||||
"goes_offline": "{channel} офлайн, зміна...",
|
||||
"claimed_drop": "Отримано дроп: {drop}",
|
||||
"claimed_points": "Отримано {points} бонусних балів",
|
||||
"earned_points": "Зароблено {points} балів за перегляд, усього: {balance}",
|
||||
"no_channel": "Немає активних каналів для перегляду. Очікування...",
|
||||
"no_campaign": "Немає активних каналів для видобутку дропів. Очікування..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "Канали",
|
||||
"switch": "Перемкнути",
|
||||
"load_points": "Завантажити бали",
|
||||
"online": "ОНЛАЙН \u2714",
|
||||
"pending": "ОФЛАЙН \u23f3",
|
||||
"offline": "ОФЛАЙН \u274c",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "Канал",
|
||||
"status": "Стан",
|
||||
"game": "Гра",
|
||||
"viewers": "Глядачі",
|
||||
"points": "Бали"
|
||||
"viewers": "Глядачі"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "...اصبح نشط ، تبديل {channel}",
|
||||
"goes_offline": "...اصبح غير نشط ، تبديل {channel}",
|
||||
"claimed_drop": "{drop} :تم الحصول على",
|
||||
"claimed_points": "تم الحصول على: {points} من النقاط الإضافية",
|
||||
"earned_points": "تم الحصول على:{points} من نقاط المشاهدة ، الإجمالي: {balance}",
|
||||
"no_channel": "...لا توجد قنوات نشطة متاحة للمشاهدة. في انتظار قناة نشطة",
|
||||
"no_campaign": "...لا توجد حملات نشطة من اجل تنقيب الإسقاطات. في انتظار حملة نشطة"
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "القنوات",
|
||||
"switch": "تبديل",
|
||||
"load_points": "تحميل النقاط",
|
||||
"online": "\u2714 نشط",
|
||||
"pending": "\u23f3 غير نشط",
|
||||
"offline": "\u274c غير نشط",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "القناة",
|
||||
"status": "الحالة",
|
||||
"game": "اللعبة",
|
||||
"viewers": "المشاهدين",
|
||||
"points": "النقاط"
|
||||
"viewers": "المشاهدين"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} がオンラインになりました。切り替え中...",
|
||||
"goes_offline": "{channel} がオフラインになりました。切り替え中...",
|
||||
"claimed_drop": "ドロップを取得しました:{drop}",
|
||||
"claimed_points": "ボーナスポイントを受け取りました:{points}",
|
||||
"earned_points": "視聴ポイントを獲得しました:{points}、合計:{balance}",
|
||||
"no_channel": "視聴可能なチャンネルがありません。オンラインになるチャンネルを待機中...",
|
||||
"no_campaign": "マイニングするドロップがないアクティブなキャンペーンはありません。アクティブなキャンペーンを待機中..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "チャンネル",
|
||||
"switch": "切り替え",
|
||||
"load_points": "ポイントを読み込む",
|
||||
"online": "オンライン \u2714",
|
||||
"pending": "オフライン中 \u23f3",
|
||||
"offline": "オフライン \u274c",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "チャンネル",
|
||||
"status": "ステータス",
|
||||
"game": "ゲーム",
|
||||
"viewers": "視聴者数",
|
||||
"points": "ポイント"
|
||||
"viewers": "視聴者数"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} 该频道已上线, 正在切换...",
|
||||
"goes_offline": "{channel} 该频道已离线, 正在切换...",
|
||||
"claimed_drop": "已领取掉宝: {drop}",
|
||||
"claimed_points": "已领取积分奖励: {points}",
|
||||
"earned_points": "观看直播获得积分: {points}, 总积分: {balance}",
|
||||
"no_channel": "没有可观看的频道,等待一个在线直播频道...",
|
||||
"no_campaign": "没有可用于掉宝的活动,等待一个有效的掉宝活动..."
|
||||
},
|
||||
@@ -92,7 +90,6 @@
|
||||
"channels": {
|
||||
"name": "活动频道",
|
||||
"switch": "切换",
|
||||
"load_points": "加载积分",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -100,8 +97,7 @@
|
||||
"channel": "直播频道",
|
||||
"status": "在线状态",
|
||||
"game": "游戏",
|
||||
"viewers": "观众",
|
||||
"points": "积分"
|
||||
"viewers": "观众"
|
||||
}
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
"goes_online": "{channel} 頻道已開始實況,正在跳轉…",
|
||||
"goes_offline": "{channel} 頻道已結束實況,正在跳轉…",
|
||||
"claimed_drop": "已領取掉寶:{drop}",
|
||||
"claimed_points": "已領取積分獎勵:{points}",
|
||||
"earned_points": "已觀看實況獲得積分:{points},總積分:{balance}",
|
||||
"no_channel": "沒有可觀看的頻道,正在等待一個正在實況的頻道…",
|
||||
"no_campaign": "沒有可用於掉寶的活動,正在等待一個有效的掉寶活動…"
|
||||
},
|
||||
@@ -92,14 +90,12 @@
|
||||
"channels": {
|
||||
"name": "活動頻道",
|
||||
"switch": "切換",
|
||||
"load_points": "載入積分",
|
||||
"online": "上線 \u2714",
|
||||
"pending": "離線 \u23f3",
|
||||
"offline": "離線 \u274c",
|
||||
"headings": {
|
||||
"channel": "頻道",
|
||||
"game": "遊戲",
|
||||
"points": "積分",
|
||||
"status": "狀態",
|
||||
"viewers": "觀眾"
|
||||
}
|
||||
|
||||
@@ -17,8 +17,6 @@ class StatusMessages(TypedDict):
|
||||
goes_online: str
|
||||
goes_offline: str
|
||||
claimed_drop: str
|
||||
claimed_points: str
|
||||
earned_points: str
|
||||
no_channel: str
|
||||
no_campaign: str
|
||||
|
||||
@@ -113,14 +111,12 @@ class GUIChannelHeadings(TypedDict):
|
||||
channel: str
|
||||
status: str
|
||||
game: str
|
||||
points: str
|
||||
viewers: str
|
||||
|
||||
|
||||
class GUIChannels(TypedDict):
|
||||
name: str
|
||||
switch: str
|
||||
load_points: str
|
||||
online: str
|
||||
pending: str
|
||||
offline: str
|
||||
@@ -230,8 +226,6 @@ default_translation: Translation = {
|
||||
"goes_online": "{channel} goes ONLINE, switching...",
|
||||
"goes_offline": "{channel} goes OFFLINE, switching...",
|
||||
"claimed_drop": "Claimed drop: {drop}",
|
||||
"claimed_points": "Claimed bonus points: {points}",
|
||||
"earned_points": "Earned points for watching: {points}, total: {balance}",
|
||||
"no_channel": "No available channels to watch. Waiting for an ONLINE channel...",
|
||||
"no_campaign": "No active campaigns to mine drops for. Waiting for an active campaign...",
|
||||
},
|
||||
@@ -323,7 +317,6 @@ default_translation: Translation = {
|
||||
"channels": {
|
||||
"name": "Channels",
|
||||
"switch": "Switch",
|
||||
"load_points": "Load Points",
|
||||
"online": "ONLINE ✔",
|
||||
"pending": "OFFLINE ⏳",
|
||||
"offline": "OFFLINE ❌",
|
||||
@@ -332,7 +325,6 @@ default_translation: Translation = {
|
||||
"status": "Status",
|
||||
"game": "Game",
|
||||
"viewers": "Viewers",
|
||||
"points": "Points",
|
||||
},
|
||||
},
|
||||
"inventory": {
|
||||
|
||||
91
twitch.py
91
twitch.py
@@ -613,7 +613,6 @@ class Twitch:
|
||||
# Add default topics
|
||||
self.websocket.add_topics([
|
||||
WebsocketTopic("User", "Drops", auth_state.user_id, self.process_drops),
|
||||
WebsocketTopic("User", "CommunityPoints", auth_state.user_id, self.process_points),
|
||||
WebsocketTopic(
|
||||
"User", "Notifications", auth_state.user_id, self.process_notifications
|
||||
),
|
||||
@@ -937,26 +936,17 @@ class Twitch:
|
||||
|
||||
@task_wrapper(critical=True)
|
||||
async def _maintenance_task(self) -> None:
|
||||
claim_period = timedelta(minutes=30)
|
||||
max_period = timedelta(hours=1)
|
||||
now = datetime.now(timezone.utc)
|
||||
next_period = now + max_period
|
||||
next_period = now + timedelta(hours=1)
|
||||
while True:
|
||||
# exit if there's no need to repeat the loop
|
||||
now = datetime.now(timezone.utc)
|
||||
if now >= next_period:
|
||||
break
|
||||
next_trigger = min(now + claim_period, next_period)
|
||||
trigger_cleanup = False
|
||||
next_trigger = next_period
|
||||
while self._mnt_triggers and self._mnt_triggers[0] <= next_trigger:
|
||||
next_trigger = self._mnt_triggers.popleft()
|
||||
trigger_cleanup = True
|
||||
if next_trigger == next_period:
|
||||
trigger_type: str = "Reload"
|
||||
elif trigger_cleanup:
|
||||
trigger_type = "Cleanup"
|
||||
else:
|
||||
trigger_type = "Points"
|
||||
trigger_type: str = "Reload" if next_trigger == next_period else "Cleanup"
|
||||
logger.log(
|
||||
CALL,
|
||||
(
|
||||
@@ -969,16 +959,9 @@ class Twitch:
|
||||
now = datetime.now(timezone.utc)
|
||||
if now >= next_period:
|
||||
break
|
||||
if trigger_cleanup:
|
||||
if next_trigger != next_period:
|
||||
logger.log(CALL, "Maintenance task requests channels cleanup")
|
||||
self.change_state(State.CHANNELS_CLEANUP)
|
||||
# ensure that we don't have unclaimed points bonus
|
||||
watching_channel = self.watching_channel.get_with_default(None)
|
||||
if watching_channel is not None:
|
||||
try:
|
||||
await watching_channel.claim_bonus()
|
||||
except Exception:
|
||||
pass # we intentionally silently skip anything else
|
||||
# this triggers a restart of this task every (up to) 60 minutes
|
||||
logger.log(CALL, "Maintenance task requests a reload")
|
||||
self.change_state(State.INVENTORY_FETCH)
|
||||
@@ -1224,65 +1207,6 @@ class Twitch:
|
||||
)
|
||||
)
|
||||
|
||||
@task_wrapper
|
||||
async def process_points(self, user_id: int, message: JsonType):
|
||||
# Example payloads:
|
||||
# {
|
||||
# "type": "points-earned",
|
||||
# "data": {
|
||||
# "timestamp": "YYYY-MM-DDTHH:MM:SS.UUUUUUUUUZ",
|
||||
# "channel_id": "123456789",
|
||||
# "point_gain": {
|
||||
# "user_id": "12345678",
|
||||
# "channel_id": "123456789",
|
||||
# "total_points": 10,
|
||||
# "baseline_points": 10,
|
||||
# "reason_code": "WATCH",
|
||||
# "multipliers": []
|
||||
# },
|
||||
# "balance": {
|
||||
# "user_id": "12345678",
|
||||
# "channel_id": "123456789",
|
||||
# "balance": 12345
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# {
|
||||
# "type": "claim-available",
|
||||
# "data": {
|
||||
# "timestamp":"YYYY-MM-DDTHH:MM:SS.UUUUUUUUUZ",
|
||||
# "claim": {
|
||||
# "id": "4ae6fefd-1234-40ae-ad3d-92254c576a91",
|
||||
# "user_id": "12345678",
|
||||
# "channel_id": "123456789",
|
||||
# "point_gain": {
|
||||
# "user_id": "12345678",
|
||||
# "channel_id": "123456789",
|
||||
# "total_points": 50,
|
||||
# "baseline_points": 50,
|
||||
# "reason_code": "CLAIM",
|
||||
# "multipliers": []
|
||||
# },
|
||||
# "created_at": "YYYY-MM-DDTHH:MM:SSZ"
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
msg_type = message["type"]
|
||||
if msg_type == "points-earned":
|
||||
data: JsonType = message["data"]
|
||||
channel: Channel | None = self.channels.get(int(data["channel_id"]))
|
||||
points: int = data["point_gain"]["total_points"]
|
||||
balance: int = data["balance"]["balance"]
|
||||
if channel is not None:
|
||||
channel.points = balance
|
||||
channel.display()
|
||||
self.print(_("status", "earned_points").format(points=f"{points:3}", balance=balance))
|
||||
elif msg_type == "claim-available":
|
||||
claim_data = message["data"]["claim"]
|
||||
points = claim_data["point_gain"]["total_points"]
|
||||
await self.claim_points(claim_data["channel_id"], claim_data["id"])
|
||||
self.print(_("status", "claimed_points").format(points=points))
|
||||
|
||||
async def get_auth(self) -> _AuthState:
|
||||
await self._auth_state.validate()
|
||||
return self._auth_state
|
||||
@@ -1617,13 +1541,6 @@ class Twitch:
|
||||
]
|
||||
return []
|
||||
|
||||
async def claim_points(self, channel_id: str | int, claim_id: str) -> None:
|
||||
await self.gql_request(
|
||||
GQL_OPERATIONS["ClaimCommunityPoints"].with_variables(
|
||||
{"input": {"channelID": str(channel_id), "claimID": claim_id}}
|
||||
)
|
||||
)
|
||||
|
||||
async def bulk_check_online(self, channels: abc.Iterable[Channel]):
|
||||
"""
|
||||
Utilize batch GQL requests to check ONLINE status for a lot of channels at once.
|
||||
|
||||
Reference in New Issue
Block a user