def __init__(self, set_details: ConnectionDetails): self.details = set_details self._ping = PingObservable() self._privmsg = PrivmsgObservable() self._join = JoinObservable() self._leave = LeaveObservable() self._kick = KickObservable() if Connection.instance != None: raise ReferenceError("Only one connection is supported, don't create a new one as long as one still exists!") Connection.instance = self
class Connection(object): send_queue = queue.Queue() details = None irc = None instance = None def sender(self): while(True): self.irc.send(self.send_queue.get()) time.sleep(1) @staticmethod def singleton(): return Connection.instance; def send_channel(self, text): """ Send to channel :return: """ self.raw_send("PRIVMSG " + self.details.get_channel() + " :" + text[0:]) def send_to_user(self, user, text): """ Send to user :return: """ self.raw_send('PRIVMSG ' + user + ' :' + text) def raw_send(self, message): self.send_queue.put(message.encode() + '\r\n'.encode()) def receive(self): """ receive from Network """ error = False try: data = self.irc.recv(4096) self.data = data if len(data) == 0: return False except socket.timeout: return False data = data.decode('UTF-8', errors='replace') self.data = data data = data.rstrip() if data.find('PING') != -1: self._ping.input(data) if data.find('PRIVMSG') != -1: self._privmsg.input(data) if data.find(' JOIN ') != -1: self._join.input(data) if data.find(' PART ') != -1: self._leave.input(data) if data.find(' KICK ') != -1: self._kick.input(data) return True def last_data(self): return self.data def establish(self): """ establish the connection """ self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.irc.connect((self.details.get_server(), self.details.get_port())) print(self.irc.recv(4096)) self.irc.send("NICK ".encode() + self.details.get_nick().encode() + "\r\n".encode()) self.irc.send("USER botty botty botty :IRC Bot\r\n".encode()) self.irc.send("JOIN ".encode() + self.details.get_channel().encode() + '\r\n'.encode()) def __init__(self, set_details: ConnectionDetails): self.details = set_details self._ping = PingObservable() self._privmsg = PrivmsgObservable() self._join = JoinObservable() self._leave = LeaveObservable() self._kick = KickObservable() if Connection.instance != None: raise ReferenceError("Only one connection is supported, don't create a new one as long as one still exists!") Connection.instance = self def observePing(self, observer): """ add observer to the observers of the ping-observable :param observer: observer to add """ self._ping.addObserver(observer) def observePrivmsg(self, observer): """ add observer to the observers of the ping-observable :param observer: observer to add """ self._privmsg.addObserver(observer) def observeJoin(self, observer): self._join.addObserver(observer) def observeLeave(self, observer): self._leave.addObserver(observer) def observeKick(self, observer): self._kick.addObserver(observer)