Implement Superchat Calculator
This commit is contained in:
@@ -1,23 +1,22 @@
|
||||
class ChatProcessor:
|
||||
'''
|
||||
Listenerからチャットデータ(actions)を受け取り
|
||||
チャットデータを加工するクラスの抽象クラス
|
||||
Abstract class that processes chat data.
|
||||
Receive chat data (actions) from Listener.
|
||||
'''
|
||||
def process(self, chat_components: list):
|
||||
'''
|
||||
チャットデータの加工を表すインターフェース。
|
||||
LiveChatオブジェクトから呼び出される。
|
||||
Interface that represents processing of chat data.
|
||||
Called from LiveChat object.
|
||||
|
||||
Parameter
|
||||
----------
|
||||
chat_components: List[component]
|
||||
component : dict {
|
||||
"video_id" : str
|
||||
動画ID
|
||||
"timeout" : int
|
||||
次のチャットの再読み込みまでの時間(秒)
|
||||
Time to fetch next chat (seconds)
|
||||
"chatdata" : List[dict]
|
||||
チャットデータのリスト
|
||||
List of chat data.
|
||||
}
|
||||
'''
|
||||
pass
|
||||
|
||||
@@ -35,7 +35,6 @@ class DefaultProcessor(ChatProcessor):
|
||||
for component in chat_components:
|
||||
timeout += component.get('timeout', 0)
|
||||
chatdata = component.get('chatdata')
|
||||
|
||||
if chatdata is None: continue
|
||||
for action in chatdata:
|
||||
if action is None: continue
|
||||
|
||||
73
pytchat/processors/superchat/calculator.py
Normal file
73
pytchat/processors/superchat/calculator.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import re
|
||||
from pytchat.processors.chat_processor import ChatProcessor
|
||||
|
||||
superchat_regex = re.compile(r"^(\D*)(\d{1,3}(,\d{3})*(\.\d*)*\b)$")
|
||||
|
||||
items_paid = [
|
||||
'addChatItemAction',
|
||||
'item',
|
||||
'liveChatPaidMessageRenderer'
|
||||
]
|
||||
|
||||
items_sticker = [
|
||||
'addChatItemAction',
|
||||
'item',
|
||||
'liveChatPaidStickerRenderer'
|
||||
]
|
||||
class Calculator(ChatProcessor):
|
||||
"""
|
||||
Calculate the amount of SuperChat by currency.
|
||||
"""
|
||||
def __init__(self):
|
||||
self.results = {}
|
||||
|
||||
def process(self, chat_components: list):
|
||||
"""
|
||||
Return
|
||||
------------
|
||||
results : dict :
|
||||
List of amount by currency.
|
||||
key: currency symbol, value: total amount.
|
||||
"""
|
||||
if chat_components is None:
|
||||
return self.results
|
||||
for component in chat_components:
|
||||
chatdata = component.get('chatdata')
|
||||
if chatdata is None: continue
|
||||
for action in chatdata:
|
||||
renderer = self._get_item(action, items_paid) or \
|
||||
self._get_item(action, items_sticker)
|
||||
if renderer is None: continue
|
||||
symbol, amount = self._parse(renderer)
|
||||
self.results.setdefault(symbol,0)
|
||||
self.results[symbol]+=amount
|
||||
return self.results
|
||||
|
||||
def _parse(self, renderer):
|
||||
purchase_amount_text = renderer["purchaseAmountText"]["simpleText"]
|
||||
m = superchat_regex.search(purchase_amount_text)
|
||||
if m:
|
||||
symbol = m.group(1)
|
||||
amount = float(m.group(2).replace(',',''))
|
||||
else:
|
||||
symbol = ""
|
||||
amount = 0.0
|
||||
return symbol, amount
|
||||
|
||||
def _get_item(self, dict_body, items: list):
|
||||
for item in items:
|
||||
if dict_body is None:
|
||||
break
|
||||
if isinstance(dict_body, dict):
|
||||
dict_body = dict_body.get(item)
|
||||
continue
|
||||
if isinstance(item, int) and \
|
||||
isinstance(dict_body, list) and \
|
||||
len(dict_body) > item:
|
||||
dict_body = dict_body[item]
|
||||
continue
|
||||
return None
|
||||
return dict_body
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user