From acd16ddff6e4166729f139f48837c8a11bb6fb3a Mon Sep 17 00:00:00 2001 From: MichaelAChrisco Date: Thu, 6 Jun 2024 21:36:38 -0700 Subject: [PATCH] MVP on irc sync --- main.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 7 ++++ 2 files changed, 109 insertions(+) create mode 100644 main.py create mode 100644 requirements.txt diff --git a/main.py b/main.py new file mode 100644 index 0000000..25a3995 --- /dev/null +++ b/main.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import logging +from getpass import getpass +from argparse import ArgumentParser + +import slixmpp +# Mostly a carbon copy of https://slixmpp.readthedocs.io/en/latest/getting_started/sendlogout.html but will have other options. + + +class SendMsgBot(slixmpp.ClientXMPP): + + """ + A basic Slixmpp bot that will log in, send a message, + and then log out. + """ + + def __init__(self, jid, password, recipient, message): + slixmpp.ClientXMPP.__init__(self, jid, password) + + # The message we wish to send, and the JID that + # will receive it. + self.recipient = recipient + self.msg = message + + # The session_start event will be triggered when + # the bot establishes its connection with the server + # and the XML streams are ready for use. We want to + # listen for this event so that we we can initialize + # our roster. + self.add_event_handler("session_start", self.start) + + async def start(self, event): + """ + Process the session_start event. + + Typical actions for the session_start event are + requesting the roster and broadcasting an initial + presence stanza. + + Arguments: + event -- An empty dictionary. The session_start + event does not provide any additional + data. + """ + self.send_presence() + await self.get_roster() + + self.send_message(mto=self.recipient, + mbody=self.msg, + mtype='chat') + + self.disconnect() + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser(description=SendMsgBot.__doc__) + + # Output verbosity options. + parser.add_argument("-q", "--quiet", help="set logging to ERROR", + action="store_const", dest="loglevel", + const=logging.ERROR, default=logging.INFO) + parser.add_argument("-d", "--debug", help="set logging to DEBUG", + action="store_const", dest="loglevel", + const=logging.DEBUG, default=logging.INFO) + + # JID and password options. + parser.add_argument("-j", "--jid", dest="jid", + help="JID to use") + parser.add_argument("-p", "--password", dest="password", + help="password to use") + parser.add_argument("-t", "--to", dest="to", + help="JID to send the message to") + parser.add_argument("-m", "--message", dest="message", + help="message to send") + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("Username: ") + if args.password is None: + args.password = getpass("Password: ") + if args.to is None: + args.to = input("Send To: ") + if args.message is None: + args.message = input("Message: ") + + # Setup the EchoBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = SendMsgBot(args.jid, args.password, args.to, args.message) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0199') # XMPP Ping + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process(forever=False) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d83173f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +aiodns==3.2.0 +cffi==1.16.0 +pyasn1==0.6.0 +pyasn1_modules==0.4.0 +pycares==4.4.0 +pycparser==2.22 +slixmpp==1.8.5 \ No newline at end of file