diff --git a/GlossBot/README.md b/GlossBot/README.md new file mode 100644 index 0000000..5276ed5 --- /dev/null +++ b/GlossBot/README.md @@ -0,0 +1,13 @@ +# GlossBot + +This bot will add words and expressions to a file. + +You can use this code in the chat by calling three different options in the chat: + + "@glossary-add word": adds the word "word" in the list + "@glossary-drift": returns a term from the list that was selected by chance + "@glossary-all": returns a list of all the saved expressions. + +To run this bot, type the following command in your terminal: + + python3 gather.py -d -j gatherbot@conversejs.org -r muc_name@muc.vvvvvvaria.org -n gatherbot -p testing -o . \ No newline at end of file diff --git a/GlossBot/gather.py b/GlossBot/gather.py new file mode 100644 index 0000000..7d360c3 --- /dev/null +++ b/GlossBot/gather.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + This bot will add words and expressions to a file. + You can use this code in the chat by calling three different options in the chat: + "@glossary-add word": adds the word "word" in the list + "@glossary-drift": returns a term from the list that was selected by chance + "@glossary-all": returns a list of all the saved expressions. + + To run this bot, type the following command in your terminal: + python3 gather.py -d -j gatherbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n gatherbot -p testing -o . +""" + +import logging +from getpass import getpass +from argparse import ArgumentParser +import slixmpp +import ssl, os, requests, urllib + +class MUCBot(slixmpp.ClientXMPP): + + def __init__(self, jid, password, room, nick, output): + slixmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.output = output + self.add_event_handler("session_start", self.start) + self.add_event_handler("groupchat_message", self.muc_message) + + + def start(self, event): + self.get_roster() + self.send_presence() + + # https://xmpp.org/extensions/xep-0045.html + self.plugin['xep_0045'].join_muc(self.room, self.nick, + # If a room password is needed, use: + # password=the_room_password, + wait=True) + + def muc_message(self, msg): + if msg['mucnick'] != self.nick: + + # Check if output folder exists + if not os.path.exists(self.output): + os.mkdir(self.output) + + # adds words to a glossary file: + if '@glossary-add' in msg['body']: + + # reply from the bot + self.send_message(mto=self.room, mbody="new word(s) added; language is in motion".format(msg['mucnick']), mtype='groupchat') + + # Add message to log + message = '{}'.format(msg['body'].replace('@glossary-add','')) + log = 'glossary.txt' + log_path = os.path.join(self.output, log) + f = open(log_path, 'a+') + f.write(message+'\n') + f.close() + + + # retrieves all terms from the growing glossary file: + if '@glossary-all' in msg['body']: + + file = open('glossary.txt', 'r') + filelist=[] + for line in file: + print(line) + filelist.append(line) + print(filelist) + + self.send_message(mto=self.room, mbody= filelist, mtype='groupchat') + + # retrieves a random term from the growing glossary file: + if '@glossary-drift' in msg['body']: + + import random + file = open('glossary.txt', 'r') + filelist=[] + for line in file: + print(line) + filelist.append(line) + print(filelist) + + self.send_message(mto=self.room, mbody= random.choice(filelist), mtype='groupchat') + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # 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("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + # output folder for images + parser.add_argument("-o", "--output", dest="output", + help="output folder, this is where the files are stored", + type=str) + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("XMPP address: ") + if args.password is None: + args.password = getpass("Password: ") + if args.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + if args.output is None: + args.output = input("Output folder: ") + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick, args.output) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + xmpp.register_plugin('xep_0066') # Process URI's (files, images) + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. + https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE + + The code has been modified for the Collective Conditions work session in Brussels, 2019, by Varia. + http://constantvzw.org/site/-Collective-Conditions,220-.html +""" diff --git a/GreetBot/README.md b/GreetBot/README.md new file mode 100644 index 0000000..d12f13c --- /dev/null +++ b/GreetBot/README.md @@ -0,0 +1,11 @@ +# GreetBot + +This bot greets every time it enters a room. + +On line 33 you can change the code after "mbody=" to add your own greeting: + + self.send_message(mto=self.room, mbody='collective conditions', mtype='groupchat') + +To run this bot, type the following command in your terminal: + + python3 greet.py -d -j greetbot@conversejs.org -r muc_name@muc.vvvvvvaria.org -n greetbot -p testing \ No newline at end of file diff --git a/GreetBot/greet.py b/GreetBot/greet.py new file mode 100644 index 0000000..420f62b --- /dev/null +++ b/GreetBot/greet.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + This bot greets every time it enters a room. + On line 33 you can change the code after "mbody=" to add your own greeting: + self.send_message(mto=self.room, mbody='collective conditions', mtype='groupchat') + + To run this bot, type the following command in your terminal: + python3 greet.py -d -j greetbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n greetbot -p testing +""" + +import logging +from getpass import getpass +from argparse import ArgumentParser +import slixmpp +import ssl, os, requests, urllib + +class MUCBot(slixmpp.ClientXMPP): + + def __init__(self, jid, password, room, nick): + slixmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + + def start(self, event): + self.get_roster() + self.send_presence() + self.plugin['xep_0045'].join_muc(self.room, self.nick, wait=True) + + """You can add your message in mbody:""" + self.send_message(mto=self.room, mbody='nice to be here', mtype='groupchat') + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # 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("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("XMPP address: ") + if args.password is None: + args.password = getpass("Password: ") + if args.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + xmpp.register_plugin('xep_0066') # Process URI's (files, images) + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. + https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE + + The code has been modified for the Collective Conditions work session in Brussels, 2019, by Varia. + http://constantvzw.org/site/-Collective-Conditions,220-.html +""" diff --git a/SparkBot/README.md b/SparkBot/README.md new file mode 100644 index 0000000..a3f84d1 --- /dev/null +++ b/SparkBot/README.md @@ -0,0 +1,14 @@ +# SparkBot + +This bot replies to a specific word. + +On line 42, you can edit the word-to-be-responded-to after "if '": + if 'target-word' in msg['body']: + +On line 44, you can edit the response options after "wordslist = ['": + + wordslist = ['a response to the target-word.'] + +To run this bot, type the following command in your terminal: + + python3 spark.py -d -j sparkbot@conversejs.org -r muc_name@muc.vvvvvvaria.org -n sparkbot -p testing \ No newline at end of file diff --git a/SparkBot/spark.py b/SparkBot/spark.py new file mode 100644 index 0000000..97aa55b --- /dev/null +++ b/SparkBot/spark.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + This bot replies to a specific word. + On line 42, you can edit the word-to-be-responded-to after "if '": + if 'target-word' in msg['body']: + On line 44, you can edit the response options after "wordslist = ['": + wordslist = ['a response to the target-word.'] + + To run this bot, type the following command in your terminal: + python3 spark.py -d -j sparkbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n sparkbot -p testing +""" + +import logging +from getpass import getpass +from argparse import ArgumentParser +import slixmpp +import random +import ssl, os, requests, urllib + +class MUCBot(slixmpp.ClientXMPP): + def __init__(self, jid, password, room, nick): + slixmpp.ClientXMPP.__init__(self, jid, password) + + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + self.add_event_handler("groupchat_message", self.muc_message) + + + def start(self, event): + self.get_roster() + self.send_presence() + + # https://xmpp.org/extensions/xep-0045.html + self.plugin['xep_0045'].join_muc(self.room, self.nick, wait=True) + + def muc_message(self, msg): + if msg['mucnick'] != self.nick: + # Everytime someone types this word or expression, the bot replies. You can edit it here: + if 'connectivity' in msg['body']: + # The list of responses one line below can be expanded with the following format: ['text','text','text'] + wordslist = ['What does this word even mean?'] + # The bot will respond with one of the options at random: + self.send_message(mto=self.room,mbody= random.choice(wordslist), mtype='groupchat') + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # 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("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + # output folder for images + parser.add_argument("-o", "--output", dest="output", + help="output folder, this is where the files are stored", + type=str) + + args = parser.parse_args() + + # Setup logging. + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if args.jid is None: + args.jid = input("XMPP address: ") + if args.password is None: + args.password = getpass("Password: ") + if args.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + xmpp.register_plugin('xep_0066') # Process URI's (files, images) + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. + https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE + + The code has been modified for the Collective Conditions work session in Brussels, 2019, by Varia. + http://constantvzw.org/site/-Collective-Conditions,220-.html +""" diff --git a/TransitBot/README.md b/TransitBot/README.md new file mode 100644 index 0000000..cb7d5fc --- /dev/null +++ b/TransitBot/README.md @@ -0,0 +1,15 @@ +# TransitBot + +This bot announces when someone enters or leaves the space. + +On line 39, you can edit the message when someone enters by editing what goes after 'mbody="': + + mbody="%s has just entered..." % (presence['muc']['nick']), + +On line 45, you can edit the message when someone leaves by editing what goes after 'mbody="': + + mbody="%s has just left..." % (presence['muc']['nick']), + +To run this bot, type the following command in your terminal: + + python3 transit.py -d -j transitbot@conversejs.org -r muc_name@muc.vvvvvvaria.org -n transitbot -p testing \ No newline at end of file diff --git a/TransitBot/transit.py b/TransitBot/transit.py new file mode 100644 index 0000000..a7ee1f9 --- /dev/null +++ b/TransitBot/transit.py @@ -0,0 +1,108 @@ +import asyncio +import logging +import slixmpp +from getpass import getpass +from argparse import ArgumentParser +from slixmpp import ClientXMPP + +""" + This bot announces when someone enters or leaves the space. + On line 39, you can edit the message when someone enters by editing what goes after 'mbody="': + mbody="%s has just entered..." % (presence['muc']['nick']), + On line 45, you can edit the message when someone leaves by editing what goes after 'mbody="': + mbody="%s has just left..." % (presence['muc']['nick']), + + To run this bot, type the following command in your terminal: + python3 transit.py -d -j transitbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n transitbot -p testing +""" + +class MUCBot(slixmpp.ClientXMPP): + + def __init__(self, jid, password, room, nick): + slixmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + self.add_event_handler("muc::%s::got_online" % self.room, self.muc_online) + self.add_event_handler("muc::%s::got_offline" % self.room, self.muc_offline) + + def start(self, event): + self.get_roster() + self.send_presence() + self.plugin['xep_0045'].join_muc(self.room, + self.nick, + wait=True) + + def muc_online(self, presence): + if presence['muc']['nick'] != self.nick: + self.send_message(mto=presence['from'].bare, + mbody="%s has just entered..." % (presence['muc']['nick']), + mtype='groupchat') + + def muc_offline(self, presence): + if presence['muc']['nick'] != self.nick: + self.send_message(mto=presence['from'].bare, + mbody="%s has just left..." % (presence['muc']['nick']), + mtype='groupchat') + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser() + + # 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("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + + 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.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + + # Setup the MUCBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = MUCBot(args.jid, args.password, args.room, args.nick) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0045') # Multi-User Chat + xmpp.register_plugin('xep_0199') # XMPP Ping + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. + https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE + + The code has been modified at various times, by various people. This version was edited for the Collective Conditions work session in Brussels, 2019, by Varia. + http://constantvzw.org/site/-Collective-Conditions,220-.html +""" diff --git a/WhisperBot/README.md b/WhisperBot/README.md new file mode 100644 index 0000000..caf9a78 --- /dev/null +++ b/WhisperBot/README.md @@ -0,0 +1,14 @@ +# WhisperBot + +This bot forwards messages it receives in private to the group channel it is part of. +On line 37 you can change the code after 'msg.reply("' to add your own message that will be sent to the person speaking to the bot: + + msg.reply("Thank you for telling me this. I will pass it on to the chatroom." % msg).send() + +On line 38 you can change the code after 'mbody="' to add your own message that will be sent to the group the bot is part of: + + self.send_message(mto=self.room, mbody="This has been whispered to me:\n%(body)s" % msg, mtype='groupchat') + +To run this bot, type the following command in your terminal: + + python3 whisper.py -j whisperbot@conversejs.org -r muc_name@muc.vvvvvvaria.org -n whisperbot -p testing \ No newline at end of file diff --git a/WhisperBot/whisper.py b/WhisperBot/whisper.py new file mode 100644 index 0000000..d304fcd --- /dev/null +++ b/WhisperBot/whisper.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" + This bot forwards messages it receives in private to the group channel it is part of. + On line 37 you can change the code after 'msg.reply("' to add your own message that will be sent to the person speaking to the bot: + msg.reply("Thank you for telling me this. I will pass it on to the chatroom." % msg).send() + On line 38 you can change the code after 'mbody="' to add your own message that will be sent to the group the bot is part of: + self.send_message(mto=self.room, mbody="This has been whispered to me:\n%(body)s" % msg, mtype='groupchat') + + To run this bot, type the following command in your terminal: + python3 whisper.py -j whisperbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n whisperbot -p testing +""" + +import logging +from getpass import getpass +from argparse import ArgumentParser +import slixmpp + + +class EchoBot(slixmpp.ClientXMPP): + + def __init__(self, jid, password, room, nick): + slixmpp.ClientXMPP.__init__(self, jid, password) + self.room = room + self.nick = nick + self.add_event_handler("session_start", self.start) + self.add_event_handler("message", self.message) + + def start(self, event): + self.send_presence() + self.get_roster() + self.plugin['xep_0045'].join_muc(self.room, self.nick, wait=True) + + def message(self, msg): + if msg['type'] in ('chat', 'normal'): + msg.reply("Thank you for telling me this. I will pass it on to the chatroom." % msg).send() + self.send_message(mto=self.room, mbody="This has been whispered to me:\n%(body)s" % msg, mtype='groupchat') + + +if __name__ == '__main__': + # Setup the command line arguments. + parser = ArgumentParser(description=EchoBot.__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("-r", "--room", dest="room", + help="MUC room to join") + parser.add_argument("-n", "--nick", dest="nick", + help="MUC nickname") + 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.room is None: + args.room = input("MUC room: ") + if args.nick is None: + args.nick = input("MUC nickname: ") + + # Setup the EchoBot and register plugins. Note that while plugins may + # have interdependencies, the order in which you register them does + # not matter. + xmpp = EchoBot(args.jid, args.password, args.room, args.nick) + xmpp.register_plugin('xep_0030') # Service Discovery + xmpp.register_plugin('xep_0004') # Data Forms + xmpp.register_plugin('xep_0060') # PubSub + xmpp.register_plugin('xep_0199') # XMPP Ping + xmpp.register_plugin('xep_0066') # Process URI's (files, images) + xmpp.register_plugin('xep_0045') # Multi-User Chat + + # Connect to the XMPP server and start processing XMPP stanzas. + xmpp.connect() + xmpp.process() + +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2010 Nathanael C. Fritz + This file is part of Slixmpp. + + See the file LICENSE for copying permission. + https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE + + The code has been modified for the Collective Conditions work session in Brussels, 2019, by Varia. + http://constantvzw.org/site/-Collective-Conditions,220-.html +"""