diff options
| author | 2024-02-14 21:07:35 -0300 | |
|---|---|---|
| committer | 2024-02-14 21:07:35 -0300 | |
| commit | 06496f5c14a523b554f23d5b75aa282befb84be9 (patch) | |
| tree | 1613f68349a96599944efef9c7921c45fcc62590 | |
| parent | d29ffc8a8f7157af6352849a5a261a53248a9c76 (diff) | |
| download | baitv-daemon-master.tar.gz baitv-daemon-master.tar.xz baitv-daemon-master.zip  | |
| -rwxr-xr-x | baitv-daemon.py | 128 | 
1 files changed, 56 insertions, 72 deletions
diff --git a/baitv-daemon.py b/baitv-daemon.py index 3e4f25d..1983f95 100755 --- a/baitv-daemon.py +++ b/baitv-daemon.py @@ -9,7 +9,7 @@ import sys  import settings  import utils -VERSION = "baitv-daemon v0.2.4" +VERSION = "baitv-daemon v0.2.5"  USERS = set()  HISTORY = [] @@ -50,15 +50,13 @@ class Client:              self.ip_hash = hashlib.md5(self.ip.encode('ascii')).hexdigest()[:5]              print("IP: {} ({})".format(self.ip, self.ip_hash)) -    @asyncio.coroutine -    def broadcast(self, msg, exclude=[]): +    async def broadcast(self, msg, exclude=[]):          users_to_send = [user for user in USERS if user not in exclude]          if users_to_send: -            yield from asyncio.wait([user.ws.send(msg) for user in users_to_send]) +            _ = [await user.ws.send(msg) for user in users_to_send] -    @asyncio.coroutine -    def on_msg(self, args): +    async def on_msg(self, args):          t = current_time()          if t - self.last_chat > settings.flood_time: @@ -67,9 +65,9 @@ class Client:              for user in USERS:                  if user != self:                      if user.mod: -                        yield from user.ws.send("FMSG:{}:{}:{}".format(self.ip_hash, color, msg)) +                        await user.ws.send("FMSG:{}:{}:{}".format(self.ip_hash, color, msg))                      else: -                        yield from user.ws.send("MSG:{}:{}".format(color, msg)) +                        await user.ws.send("MSG:{}:{}".format(color, msg))              self.last_chat = t @@ -77,28 +75,25 @@ class Client:              if len(HISTORY) > settings.history_length:                  HISTORY.pop(0)          else: -            yield from self.ws.send("FLOOD") +            await self.ws.send("FLOOD") -    @asyncio.coroutine -    def on_notice(self, args): +    async def on_notice(self, args):          (showname, msg) = args          if showname == "1": -            yield from self.broadcast("NOTICE:{}:{}".format(self.mod, msg), [self]) +            await self.broadcast("NOTICE:{}:{}".format(self.mod, msg), [self])          else: -            yield from self.broadcast("NOTICE::{}".format(msg), [self]) +            await self.broadcast("NOTICE::{}".format(msg), [self]) -    @asyncio.coroutine -    def on_history(self, args): +    async def on_history(self, args):          if HISTORY:              msgs = min(len(HISTORY), int(args[0])) * -1              for msg in HISTORY[msgs:]: -                yield from self.ws.send("HMSG:{}:{}:{}".format(*msg)) +                await self.ws.send("HMSG:{}:{}:{}".format(*msg)) -        yield from self.ws.send("HISTORY_OK") +        await self.ws.send("HISTORY_OK") -    @asyncio.coroutine -    def on_login(self, args): +    async def on_login(self, args):          valid_psks = utils.parse_streamers_file(settings.streamers_file)          psk = args[0] @@ -106,62 +101,56 @@ class Client:              print("User logged in")              self.mod = valid_psks[psk] -            yield from self.ws.send("LOGIN_OK:{}".format(self.mod)) +            await self.ws.send("LOGIN_OK:{}".format(self.mod))          else: -            yield from self.ws.send("BADPASS") +            await self.ws.send("BADPASS") -    @asyncio.coroutine -    def on_logout(self, args): +    async def on_logout(self, args):          self.mod = None -        yield from self.ws.send("LOGOUT_OK") +        await self.ws.send("LOGOUT_OK") -    @asyncio.coroutine -    def on_kick(self, args): +    async def on_kick(self, args):          users_to_kick = [user for user in USERS if args[0] == user.ip_hash]          if users_to_kick: -            yield from self.broadcast("KICKED", users_to_kick) +            await self.broadcast("KICKED", users_to_kick)              for user in users_to_kick: -                    yield from user.ws.send("YOU_KICKED") -                    yield from user.ws.close(4000, "Has sido expulsado.") +                await user.ws.send("YOU_KICKED") +                await user.ws.close(4000, "Has sido expulsado.") -            yield from self.ws.send("KICK_OK") +            await self.ws.send("KICK_OK")              print("Kicked " + args[0]) -    @asyncio.coroutine -    def on_ban(self, args): +    async def on_ban(self, args):          users_to_ban = [user for user in USERS if args[0] == user.ip_hash]          if users_to_ban: -            yield from self.broadcast("BANNED", users_to_ban) +            await self.broadcast("BANNED", users_to_ban)              utils.add_ban(users_to_ban[0].ip, settings.bans_file)              for user in users_to_ban: -                yield from user.ws.send("YOU_BANNED") -                yield from user.ws.close(4001, "Has sido baneado.") +                await user.ws.send("YOU_BANNED") +                await user.ws.close(4001, "Has sido baneado.") -            yield from self.ws.send("BAN_OK") +            await self.ws.send("BAN_OK")              print("Banned " + ip_to_ban) -    @asyncio.coroutine -    def on_settitle(self, args): +    async def on_settitle(self, args):          update_state('title', args[0]) -        yield from self.broadcast("TITLE:{}".format(args[0]), [self]) +        await self.broadcast("TITLE:{}".format(args[0]), [self]) -    @asyncio.coroutine -    def on_setsource(self, args): +    async def on_setsource(self, args):          t = timestamp()          update_state('source', args[0])          update_state('source_time', t) -        yield from self.broadcast("SOURCE:{}:{}".format(args[0], t), [self]) +        await self.broadcast("SOURCE:{}:{}".format(args[0], t), [self]) -    @asyncio.coroutine -    def handle_message(self, msg_in): +    async def handle_message(self, msg_in):          if len(msg_in) > settings.max_cmd_length: -            yield from self.ws.send("FUCKOFF") +            await self.ws.send("FUCKOFF")              return          args = msg_in.split(":") @@ -171,72 +160,67 @@ class Client:              if len(args) - 1 == required_args:                  if need_mod:                      if self.mod: -                        yield from cmd_to_run(args[1:]) +                        await cmd_to_run(args[1:])                      else: -                        yield from self.ws.send("FORBIDDEN") +                        await self.ws.send("FORBIDDEN")                  else: -                    yield from cmd_to_run(args[1:]) +                    await cmd_to_run(args[1:])              else: -                yield from self.ws.send("INVALID") +                await self.ws.send("INVALID")          else: -            yield from self.ws.send("WHAT") +            await self.ws.send("WHAT") -@asyncio.coroutine -def broadcast(msg): +async def broadcast(msg):      print("broadcasting " + msg)      if USERS: -        yield from asyncio.wait([user.ws.send(msg) for user in USERS]) +        _ = [await user.ws.send(msg) for user in USERS] -@asyncio.coroutine -def notify_count(): +async def notify_count():      total_users = len(USERS) -    yield from broadcast("COUNT:{}".format(total_users)) +    await broadcast("COUNT:{}".format(total_users)) -@asyncio.coroutine -def register(websocket): +async def register(websocket):      USERS.add(websocket) -    yield from notify_count() +    await notify_count() -@asyncio.coroutine -def unregister(websocket): +async def unregister(websocket):      USERS.remove(websocket) -    yield from notify_count() +    await notify_count() -@asyncio.coroutine -def baitv_daemon(websocket, path): +async def baitv_daemon(websocket, path):      print("New client ({})".format(websocket.remote_address))      try:          real_ip = websocket.request_headers['X-Real-IP'] -    except ValueError: +    except:          real_ip = websocket.remote_address[0]      this_client = Client(websocket, real_ip) -    yield from websocket.send("WELCOME:{}".format(VERSION)) +    await websocket.send("WELCOME:{}".format(VERSION))      #print(list(websocket.request_headers.raw_items()))      if utils.is_banned(real_ip, settings.bans_file): -        yield from websocket.send("YOU_BANNED") -        yield from websocket.close(4002, "Estás baneado.") +        await websocket.send("YOU_BANNED") +        await websocket.close(4002, "Estás baneado.")          return      if real_ip != "127.0.0.1": -        yield from register(this_client) +        await register(this_client)      try:          while True: -            msg_in = yield from websocket.recv() +            msg_in = await websocket.recv()              print("< {}".format(msg_in)) -            yield from this_client.handle_message(msg_in) +            await this_client.handle_message(msg_in)      except websockets.ConnectionClosed as e:          print("Connection was closed. ({}|{})".format(e.code, e.reason))      finally:          print("Client disconnected ({})".format(websocket.remote_address))          if real_ip != "127.0.0.1": -            yield from unregister(this_client) +            await unregister(this_client)  print("baitv-daemon {}".format(VERSION))  | 
