Ongoing collection of bots for the Bots of Conduct workshop. This repository will be gathering code written by many people during various moments (Relearn 2017, Relearn 2019, ongoing Varia work).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
6.6 KiB

#!/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
"""