summary refs log tree commit diff
path: root/util.py
diff options
context:
space:
mode:
authorPawky Laguish2024-11-26 21:16:05 +0000
committerPawky Laguish2024-11-26 21:16:05 +0000
commitea30e6ff34f6c5356e42c23a3b0c74fbbaa17771 (patch)
tree9a2f3125c5755bafc9b279103a29030fb608c244 /util.py
wip
Diffstat (limited to 'util.py')
-rw-r--r--util.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/util.py b/util.py
new file mode 100644
index 0000000..8538ef3
--- /dev/null
+++ b/util.py
@@ -0,0 +1,95 @@
+import irctokens
+import time
+from fnmatch import fnmatchcase
+
+
+class Util:
+    def __init__(self, config, sock):
+        self.sock = sock
+        self.config = config
+        self.target = ""
+        self.dict = {
+            "\x00": "\\x00",
+            "\x01": "\\x01",
+            "\x02": "\\x02",
+            "\x03": "\\x03",
+            "\x04": "\\x04",
+            "\x05": "\\x05",
+            "\x06": "\\x06",
+            "\x07": "\\x07",
+            "\x08": "\\x08",
+            "\x09": "\\x09",
+            "\x0a": "\\x0a",
+            "\x0b": "\\x0b",
+            "\x0c": "\\x0c",
+            "\x0d": "\\x0d",
+            "\x0e": "\\x0e",
+            "\x0f": "\\x0f",
+            "\x10": "\\x10",
+            "\x11": "\\x11",
+            "\x12": "\\x12",
+            "\x13": "\\x13",
+            "\x14": "\\x14",
+            "\x15": "\\x15",
+            "\x16": "\\x16",
+            "\x17": "\\x17",
+            "\x18": "\\x18",
+            "\x19": "\\x19",
+            "\x1a": "\\x1a",
+            "\x1b": "\\x1b",
+            "\x1c": "\\x1c",
+            "\x1d": "\\x1d",
+            "\x1e": "\\x1e",
+            "\x1f": "\\x1f",
+            "\x7f": "\\x7f",
+        }
+
+    def send(self, raw: str):
+        stri = raw
+        for k, v in self.dict.items():
+            stri = stri.replace(k, v)
+        print(f"{time.strftime('%H:%M:%S')} > {stri}")
+        self.sock.sendall(f"{raw}\r\n".encode("utf8"))
+
+    def quit(self, msg=None):
+        if msg != None:
+            self.send("QUIT :" + msg)
+        else:
+            self.send("QUIT")
+
+    def nick(self, nick=None):
+        if nick == None:
+            self.send("NICK " + self.config.self.nick)
+        else:
+            self.send("NICK " + nick)
+
+    def _m(self, msg: str, t=None):
+        if t == None:
+            t = self.target
+        msg = str(msg).partition("\n")[0]
+        if len(msg) >= 460:
+            msg = msg[:460]
+            self.mesg("message too long!")
+        return t, msg
+
+    def mesg(self, msg: str, t=None):
+        t, msg = self._m(msg, t)
+        self.send(irctokens.build("PRIVMSG", [t, str(msg)]).format())
+
+    def action(self, msg: str, t=None):
+        t, msg = self._m(msg, t)
+        self.send(
+            irctokens.build("PRIVMSG", [t, "\x01ACTION " + str(msg) + "\x01"]).format()
+        )
+
+    def notice(self, msg: str, t=None):
+        t, msg = self._m(msg, t)
+        self.send(irctokens.build("NOTICE", [t, str(msg)]).format())
+
+    def maskmatch(self, string: str, hostmask: str):
+        """DOES NOT HANDLE CASEMAPPING (yet), just dumb case-sensitive match, only ? and * are special"""
+        print("string is", string, "and hostmask is", hostmask)
+        pat = "[[]".join(
+            [x.replace("]", "[]]") for x in hostmask.split("[")]
+        )  # escape all [ and ] into [[] and []]
+        return fnmatchcase(string, pat)