def channel_message(self, event): sed_split = re.split(REGEX_SPLIT, event["message"], 3) if len(sed_split) > 2: if not self._closest_setting(event, "sed", False): return regex_flags = 0 flags = (sed_split[3:] or [""])[0] count = None last_flag = "" for flag in flags: if flag.isdigit(): if last_flag.isdigit(): count = int(str(count) + flag) elif not count: count = int(flag) elif flag == "i": regex_flags |= re.I elif flag == "g": count = 0 last_flag = flag if count == None: count = 1 try: pattern = re.compile(sed_split[1], regex_flags) except: traceback.print_exc() event["stderr"].write("Invalid regex in pattern") return for_user = event["match"].group(1) if self._closest_setting(event, "sed-sender-only", False): for_user = event["user"].nickname with utils.deadline(): match = event["target"].buffer.find(pattern, from_self=False, for_user=for_user, not_pattern=REGEX_SED) if match: replace = sed_split[2] replace = replace.replace("\\/", "/") replace = re.sub(SED_AMPERSAND, "\\1%s" % match.match, replace) replace = utils.irc.bold(replace) new_message = re.sub(pattern, replace, match.line.message, count) if match.line.action: prefix = "* %s" % match.line.sender else: prefix = "<%s>" % match.line.sender event["stdout"].write("%s %s" % (prefix, new_message))
def mumble(self, event): server = None if not event["args"]: server = event["target"].get_setting( "mumble-server", event["server"].get_setting("mumble-server", None)) elif event["args"]: server = event["args_split"][0] if not server: raise utils.EventError("Please provide a server") server, _, port = server.partition(":") if port: if not port.isdigit(): raise utils.EventError("Port must be numeric") port = int(port) else: port = DEFAULT_PORT timestamp = datetime.datetime.utcnow() ping_packet = struct.pack(">iQ", 0, 123) s = socket.socket(type=socket.SOCK_DGRAM) s.settimeout(5) with utils.deadline(): try: s.sendto(ping_packet, (server, port)) except socket.gaierror as e: raise utils.EventError(str(e)) try: pong_packet = s.recv(24) except socket.timeout: raise utils.EventError( "Timed out waiting for response from %s:%d" % (server, port)) pong = struct.unpack(">bbbbQiii", pong_packet) version = ".".join(str(v) for v in pong[1:4]) ping = (datetime.datetime.utcnow() - timestamp).total_seconds() * 1000 users = pong[5] max_users = pong[6] bandwidth = pong[7] / 1000 # kbit/s event["stdout"].write( "%s:%d (v%s): %d/%d users, %.1fms ping, %dkbit/s bandwidth" % (server, port, version, users, max_users, ping, bandwidth))
def tcpup(self, event): hostname, _, port = event["args_split"][0].partition(":") port = utils.parse.try_int(port or "80") if port == None: raise utils.EventError("Port must be a number") error = None try: with utils.deadline(seconds=5): socket.create_connection((hostname, port)) except utils.DeadlineExceededException: error = "timed out" except Exception as e: error = str(e) if error == None: event["stdout"].write("%s:%d looks up to me" % (hostname, port)) else: event["stderr"].write("%s:%d looks down to me (%s)" % (hostname, port, error))
def channel_message(self, event): for_user = event["match"].group(1) sed_s = event["message"] if for_user: sed_s = sed_s.split(" ", 1)[1] if not self._closest_setting(event, "sed", False): return try: sed = utils.parse.sed.parse(event["message"]) except: traceback.print_exc() event["stderr"].write("Invalid regex in pattern") return sed.replace = utils.irc.bold(sed.replace) if self._closest_setting(event, "sed-sender-only", False): for_user = event["user"].nickname match_line = None match_message = None with utils.deadline(): for line in event["target"].buffer.get_all(for_user): if not line.from_self: match = sed.match(line.message) if not match == line.message: match_line = line match_message = match break if match_line: if match_line.action: format = "* %s %s" else: format = "<%s> %s" event["stdout"].write(format % (match_line.sender, match_message))
def channel_message(self, event): sed_split = re.split(REGEX_SPLIT, event["message"], 3) if len(sed_split) > 2: if not self._closest_setting(event, "sed", False): return regex_flags = 0 flags = (sed_split[3:] or [""])[0].split(" ", 1)[0] count = None last_flag = "" for flag in flags: if flag.isdigit(): if last_flag.isdigit(): count = int(str(count) + flag) elif not count: count = int(flag) elif flag == "i": regex_flags |= re.I elif flag == "g": count = 0 last_flag = flag if count == None: count = 1 try: pattern = re.compile(sed_split[1], regex_flags) except: traceback.print_exc() event["stderr"].write("Invalid regex in pattern") return for_user = event["match"].group(1) if self._closest_setting(event, "sed-sender-only", False): for_user = event["user"].nickname match_line = None match = None match_message = None with utils.deadline(): for line in event["target"].buffer.get_all(for_user): if not line.from_self: message = line.notes.get("sed-line", line.message) match = pattern.search(message) if match and not REGEX_SED.match(message): match_line = line match = match.group(0) match_message = message break if match: replace = sed_split[2] replace = replace.replace("\\/", "/") with utils.deadline(): for found in SED_AMPERSAND.finditer(replace): found = found.group(1) replace.replace(found, "%s%s" % (found, match)) replace_color = utils.irc.bold(replace) new_message = re.sub(pattern, replace, message, count) new_message_color = re.sub(pattern, utils.irc.bold(replace), message, count) if match_line.action: prefix = "* %s" % match_line.sender else: prefix = "<%s>" % match_line.sender match_line.notes["sed-line"] = new_message event["stdout"].write("%s %s" % (prefix, new_message_color))