Пример #1
0
    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))
Пример #2
0
    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))
Пример #3
0
    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))
Пример #4
0
    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))
Пример #5
0
    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))