65 lines
1.8 KiB
Python
Executable file
65 lines
1.8 KiB
Python
Executable file
#!/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:
|