72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
|
import asyncio
|
||
|
import socketio
|
||
|
|
||
|
class PatchedAsyncClient(socketio.AsyncClient):
|
||
|
async def _handle_event(self, namespace, id, data):
|
||
|
namespace = namespace or '/'
|
||
|
await super()._handle_event(namespace, id, data)
|
||
|
await self._trigger_event('message', namespace, *data[1:])
|
||
|
|
||
|
class SoulClient:
|
||
|
def __init__(self):
|
||
|
self.sio = PatchedAsyncClient(logger=True)
|
||
|
self.sio.on('connect', self._on_connect)
|
||
|
self.sio.on('message', self._on_message)
|
||
|
|
||
|
self.call_lock = asyncio.Lock()
|
||
|
self.callback = None
|
||
|
|
||
|
async def _on_connect(self, namespace=None):
|
||
|
await self.call('init')
|
||
|
|
||
|
async def _on_message(self, msg):
|
||
|
if self.call_lock.locked():
|
||
|
self.call_lock.release()
|
||
|
if self.callback:
|
||
|
self.callback.set_result(msg)
|
||
|
|
||
|
async def connect(self):
|
||
|
await self.sio.connect("wss://animesoul.com/socket.io/", transports=['websocket'])
|
||
|
|
||
|
async def run(self):
|
||
|
await self.sio.wait()
|
||
|
|
||
|
async def cast(self, event_name, data=None):
|
||
|
await self.sio.emit(event_name, data)
|
||
|
|
||
|
async def call(self, event_name, data=None):
|
||
|
await self.call_lock.acquire()
|
||
|
await self.sio.emit(event_name, data)
|
||
|
|
||
|
self.callback = asyncio.get_event_loop().create_future()
|
||
|
return await self.callback
|
||
|
|
||
|
class Card:
|
||
|
IMAGE_CDN = "https://cdn.animesoul.com/images/cards"
|
||
|
|
||
|
def __init__(self, kwargs):
|
||
|
self.pk = kwargs.get("_id")
|
||
|
self.name = kwargs.get("name")
|
||
|
self.slug = kwargs.get("slug")
|
||
|
self.tier = kwargs.get("tier")
|
||
|
self.claim_count = kwargs.get("claim_count")
|
||
|
|
||
|
extra = kwargs.get("category")
|
||
|
try:
|
||
|
self.anime = extra[0]
|
||
|
except IndexError:
|
||
|
self.anime = None
|
||
|
|
||
|
self.filename = kwargs.get("file")
|
||
|
self.url = f"{self.IMAGE_CDN}/{self.tier}/{self.filename}"
|
||
|
|
||
|
def to_dict(self):
|
||
|
return {
|
||
|
"id": self.pk,
|
||
|
"name": self.name,
|
||
|
"tier": self.tier,
|
||
|
"anime": self.anime,
|
||
|
"link": self.url,
|
||
|
"claim_count": self.claim_count,
|
||
|
}
|