Remove channel points handling

This commit is contained in:
DevilXD
2025-05-01 17:06:18 +02:00
parent 9fbbbee5ef
commit 240ba23b0c
23 changed files with 23 additions and 232 deletions

View File

@@ -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,

View File

@@ -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
View File

@@ -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,

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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"
}

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": "觀眾"
}

View File

@@ -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": {

View File

@@ -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.