Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import traceback
- import socket
- import time
- def byte(n):
- return bytes([n])
- class RetriableSocket:
- def __init__(self, addr):
- self.sock = socket.socket()
- self.sock.connect(addr)
- def close(self):
- self.sock.close()
- def send(self, s):
- if isinstance(s, int): s = byte(s)
- if isinstance(s, str): s = s.encode('utf-8')
- i = 0
- while i < len(s): i += self.sock.send(s[i:])
- def recv(self, n):
- data = b''
- while len(data) < n: data += self.sock.recv(n - len(data))
- return data
- class StemClient:
- def __init__(self):
- self.sock = RetriableSocket(('stem.fomalhaut.me', 5733))
- def disconnect(self):
- if self.sock:
- self.sock.close()
- self.sock = None
- def send_package(self, _type, _id, _message=None):
- pack = byte(_type)
- if _type == 3 or _type == 4:
- pack += _id
- else:
- pack += byte(len(_id))
- pack += _id.encode('utf-8')
- if _message: pack += _message.encode('utf-8')
- self.sock.send(len(pack) // 256)
- self.sock.send(len(pack) % 256)
- self.sock.send(pack)
- def subscribe(self, channel):
- self.send_package(1, channel)
- def unsubscribe(self, channel):
- self.send_package(2, channel)
- def send(self, channel, msg):
- self.send_package(0, channel, msg)
- def recv(self):
- pack_len = self.sock.recv(2)
- pack_type = self.sock.recv(1)
- if pack_type == b'\0': # incoming msg
- ch_len = self.sock.recv(1)[0] # getting int from byte string
- ch_id = self.sock.recv(ch_len)
- msg_len = pack_len[0] * 256 + pack_len[1]
- msg_len -= ch_len + 2
- msg = self.sock.recv(msg_len)
- return str(msg, 'utf-8')
- elif pack_type == b'\3': # pinging
- msg_len = pack_len[0] * 256 + pack_len[1] - 1
- self.send_package(4, self.sock.recv(msg_len))
- return None
- client = StemClient()
- try:
- last_channel = ''
- buffer = ''
- while True:
- command = input()
- if command.startswith('/target'):
- buffer = buffer[:-2]
- if buffer:
- client.send(last_channel, buffer)
- print(buffer, 'sent')
- buffer = ''
- last_channel = command[8:]
- elif command.startswith('/reset'):
- buffer = buffer
- print(buffer, 'reset')
- buffer = ''
- elif command.startswith('/flush'):
- buffer = buffer[:-2]
- client.send(last_channel, buffer)
- print(buffer, 'sent')
- buffer = ''
- else:
- buffer += command + '\r\n'
- except KeyboardInterrupt:
- client.disconnect()
- except:
- __import__('traceback').print_exc()
- input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement