jaken/jaken/soul.py

77 lines
2.2 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")
self.anime = None
self.batch = None
try:
extra = kwargs.get("category")
self.anime = extra[0]
self.batch = extra[-1]
except IndexError:
pass
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,
"batch": self.batch,
}