def handle(self, origin, args): if parse_numeric(args[1], self._state.max_client_numerics) \ == \ (self._state.server_id, None): self._connection.register_pong() else: self._state.register_pong( origin, parse_numeric(args[0], self._state.max_client_numerics), parse_numeric(args[1], self._state.max_client_numerics) )
def handle(self, origin, args): self._state.change_nick( origin, parse_numeric(args[0], self._state.max_client_numerics), args[1], self._state.ts )
def handle(self, origin, args): for search in args[1].split(","): self._state.request_whois( origin, parse_numeric(args[0], self._state.max_client_numerics), search )
def handle(self, origin, args): # Parse mode string if exists, and any option arguments if origin[1] == None: modes = [] if args[5][0] == "+": nextarg = 6 for mode in args[5][1:]: if mode == "r" or mode == "h": modes.append(('+' + mode, args[nextarg])) nextarg = nextarg + 1 else: modes.append(('+' + mode, None)) self._state.new_user( origin, parse_numeric(args[-2], self._state.max_client_numerics), args[0], args[3], args[4], modes, to_int(args[-3]), args[1], args[2], args[-1] ) else: self._state.change_nick(origin, origin, args[0], args[1])
def handle(self, origin, args): # Handle channel collisions cstatus = self._state.create_channel(origin, args[0], int(args[1])) nextarg = 2 # Handle channel modes if len(args) > nextarg: if args[nextarg][0] == "+": # But only if this is a new channel if cstatus: modes = [] for mode in args[nextarg][1:]: if mode == "k" or mode == "l": nextarg = nextarg + 1 modes.append(("+" + mode, args[nextarg])) else: modes.append(("+" + mode, None)) self._state.change_channel_mode(origin, args[0], modes) nextarg = nextarg + 1 # Handle users on the channel if len(args) > nextarg: umodes = "" for user in args[nextarg].split(','): # Handle any user modes, but only if this is a new channel user = user.split(":") if len(user) > 1: umodes = user[1] if cstatus: self._state.join_channel( parse_numeric(user[0], self._state.max_client_numerics), parse_numeric(user[0], self._state.max_client_numerics), args[0], umodes ) else: self._state.join_channel( parse_numeric(user[0], self._state.max_client_numerics), parse_numeric(user[0], self._state.max_client_numerics), args[0], "" ) nextarg = nextarg + 1 # Handle channel bans, but only if this is a new channel if len(args) > nextarg and cstatus: if args[nextarg][0] == "%": for ban in args[nextarg][1:].split(): self._state.add_channel_ban(origin, args[0], ban)
def handle(self, origin, args): target = args[0] info = args[1].split(None, 1) path = info[0].split("!") reason = info[1].strip("()") self._state.kill( origin, parse_numeric(target, self._state.max_client_numerics), path, reason )
def handle(self, origin, args): if len(args) > 2: extra = args[2] else: extra = None self._state.request_stats( origin, parse_numeric(args[1], self._state.max_client_numerics), args[0], extra )
def parse(self, string): """ Take a string, parse it into our internal form and pass it on """ # Tidy up our line string = self._check_line_is_good(string) # Break up into origin, token and body high_level_parts = string.split(None, 2) origin = parse_numeric(high_level_parts[0], self._maxclientnum) command = high_level_parts[1] if not command.isupper() and not command.isdigit(): raise ProtocolError('Command not in uppercase', string) if len(high_level_parts) > 2: params = self._parse_params(high_level_parts[2]) else: params = [] # If this is an invalid command, pass it upwards try: self._pass_to_handler(origin, command, params) except ParseError, error: raise ParseError(error.value, string)
def handle(self, origin, args): target = parse_numeric(args[0], self._state.max_client_numerics) for channel in args[1].split(","): self._state.join_channel(origin, target, channel, [])
def handle(self, origin, args): finalmodes = [] if args[0][0] == "#": # Channel mode changes channel = args[0] modes = args[1] nextarg = 2 flag = "+" for mode in modes: if mode == "+" or mode == "-": flag = mode # Limit only takes arg when set. Key always takes arg. elif mode == "k" or (mode == "l" and flag == "+"): finalmodes.append((flag + mode, args[nextarg])) nextarg = nextarg + 1 elif mode == "b": if flag == "-": self._state.remove_channel_ban( origin, channel, args[nextarg]) nextarg = nextarg + 1 else: self._state.add_channel_ban( origin, channel, args[nextarg]) nextarg = nextarg + 1 elif mode == "o": if flag == "-": self._state.deop( origin, channel, parse_numeric(args[nextarg], self._state.max_client_numerics) ) nextarg = nextarg + 1 else: self._state.op( origin, channel, parse_numeric(args[nextarg], self._state.max_client_numerics) ) nextarg = nextarg + 1 elif mode == "v": if flag == "-": self._state.devoice( origin, channel, parse_numeric(args[nextarg], self._state.max_client_numerics)) nextarg = nextarg + 1 else: self._state.voice( origin, channel, parse_numeric(args[nextarg], self._state.max_client_numerics)) nextarg = nextarg + 1 else: finalmodes.append((flag + mode, None)) if len(finalmodes) > 0: self._state.change_channel_mode(origin, channel, finalmodes) else: # User mode changes modes = args[1] nextarg = 2 flag = "+" finalmodes = [] for mode in modes: if mode == "+" or mode == "-": flag = mode #elif mode == "s": # self._state.change_user_mode( # origin, [(flag + mode, args[nextarg])] # ) # nextarg = nextarg + 1 else: finalmodes.append((flag + mode, None)) self._state.change_user_mode(origin, finalmodes)
def handle(self, origin, args): self._state.request_channel_users( origin, parse_numeric(args[1], self._state.max_client_numerics), args[0].split(",") )
def testMaxNumEquiv(self): self.assertEqual(parse_numeric('ABABA', dict({1: 63})), parse_numeric('ABAAA', dict({1: 63})))
def testUniversalIRCUNumericParse(self): self.assertEqual((0, 0), parse_numeric('AAAA', dict({0: 262143}))) self.assertEqual((32, 127), parse_numeric('gAB]', dict({32: 262143})))
def testShortServerNumericParse(self): self.assertEqual((0, None), parse_numeric('A', dict({0: 262143}))) self.assertEqual((32, None), parse_numeric('g', dict({32: 262143})))
def testShortClientNumericParse(self): self.assertEqual((0, 0), parse_numeric('AAA', dict({0: 262143}))) self.assertEqual((2, 90), parse_numeric('CBa', dict({2: 262143})))
def testExtendedServerNumericParse(self): self.assertEqual((0, None), parse_numeric('AA', dict({0: 262143}))) self.assertEqual((127, None), parse_numeric('B]', dict({127: 262143})))
def handle(self, origin, line): self._state.authenticate(origin, parse_numeric(line[0], self._state.max_client_numerics), line[1])
def handle(self, origin, args): self._state.request_lusers( origin, parse_numeric(args[1], self._state.max_client_numerics), args[0] )
def handle(self, origin, args): self._state.trace( origin, args[0], parse_numeric(args[1], self._state.max_client_numerics) )
def handle(self, origin, args): try: target = parse_numeric(args[0], self._state.max_client_numerics) except Base64Error: target = args[0] self._state.notice(origin, target, args[-1])
def handle(self, origin, args): self._state.request_admininfo( origin, parse_numeric(args[0], self._state.max_client_numerics) )
def testExtendedClientNumericParse(self): self.assertEqual((0, 0), parse_numeric('AAAAA', dict({0: 262143}))) self.assertEqual((127, 90), parse_numeric('B]ABa', dict({127: 262143})))