#!/usr/bin/env python3 # Illustrates how to test irkerd. # # First argument must be a channel URL. If it does not begin with "irc", # the base URL for freenode is prepended. # # Second argument must be a payload string. Standard C-style escapes # such as \n and \t are decoded. # # SPDX-License-Identifier: BSD-2-Clause import json import socket import sys import fileinput DEFAULT_SERVER = ("localhost", 6659) def connect(server = DEFAULT_SERVER): return socket.create_connection(server) def send(s, target, message): data = {"to": target, "privmsg" : message} dump = json.dumps(data) if not isinstance(dump, bytes): dump = dump.encode('ascii') s.sendall(dump) def irk(target, message, server = DEFAULT_SERVER): s = connect(server) if "irc:" not in target and "ircs:" not in target: target = "irc://chat.freenode.net/{0}".format(target) if message == '-': for line in fileinput.input('-'): send(s, target, line.rstrip('\n')) else: send(s, target, message) s.close() def main(): if len(sys.argv) < 2: sys.stderr.write("irk: a URL argument is required\n") sys.exit(1) target = sys.argv[1] message = " ".join(sys.argv[2:]) # Allows pretty formatting of irker messages if str == bytes: message = message.decode('string_escape') # The actual IRC limit is 512. Avoid any off-by-ones chunksize = 511 try: while message[:chunksize]: irk(target, message[:chunksize]) message = message[chunksize:] except socket.error as e: sys.stderr.write("irk: write to server failed: %r\n" % e) sys.exit(1) if __name__ == '__main__': main() # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: