@ -52,7 +52,7 @@ def write_to_log(self, entry):
# check if file exists, if not: write it!
if not os . path . isfile ( log_path ) :
html_template = open ( ' templates/log .html ' , ' r ' ) . read ( )
html_template = open ( ' templates/index .html ' , ' r ' ) . read ( )
css_template = open ( ' templates/stylesheet.css ' , ' r ' ) . read ( )
with open ( log_path , ' w ' ) as l :
l . write ( html_template )
@ -71,7 +71,6 @@ def write_to_log(self, entry):
< small class = " postid " > { handle } < / small >
{ entry }
< small class = " date " > Added on { now } < / small >
< small class = " tags " > Tags : < span class = " tagcontainer " > < / span > < / small >
< / div > '''
print ( f ' Post: { post } ' )
with open ( log_path , ' a+ ' ) as l :
@ -81,34 +80,37 @@ def write_to_log(self, entry):
h . write ( handle )
print ( ' added to the .handles file! ' )
def find_in_soup ( self , handle , tag ) :
print ( ' --------ADD TAG --------- ' )
print ( f ' handle: { handle } ' )
log = ' index.html '
log_path = os . path . join ( self . output , log )
html = open ( log_path , ' r ' ) . read ( )
soup = BeautifulSoup ( html , ' html.parser ' )
# print(soup.prettify())
post = soup . find ( id = handle )
# print(f'posts: { posts }')
# for post in posts:
print ( f ' post: { post } ' )
if post :
# tagcontainer = post.findChildren(id="tagcontainer", recursive=True)[0]
# print(f'tagcontainer: { tagcontainer }')
# print(f'tagcontainer.contents: { tagcontainer.contents }')
# tagcontainer.contents.append(f'<span class="tag">{ tag }</span>')
# print(f'tagcontainer.contents: { tagcontainer.contents }')
# new_tag = soup.new_tag("a", href="http://www.example.com")
new_tag = soup . new_tag ( " span " )
new_tag . append ( tag )
soup . find ( id = handle ) . find ( class_ = " tagcontainer " ) . append ( new_tag )
print ( f ' new soup: { str ( soup ) } ' )
# write soup to file
with open ( log_path , ' w ' ) as l :
l . write ( str ( soup ) )
# *spark
# add annotations
# def find_in_soup(self, handle, annotation):
# print('--------ADD ANNOTATION ---------')
# print(f'handle: { handle }')
# log = 'index.html'
# log_path = os.path.join(self.output, log)
# html = open(log_path, 'r').read()
# soup = BeautifulSoup(html, 'html.parser')
# # print(soup.prettify())
# post = soup.find(id=handle)
# # print(f'posts: { posts }')
# # for post in posts:
# print(f'post: { post }')
# if post:
# # annotationcontainer = post.findChildren(id="annotationcontainer", recursive=True)[0]
# # print(f'annotationcontainer: { annotationcontainer }')
# # print(f'annotationcontainer.contents: { annotationcontainer.contents }')
# # annotationcontainer.contents.append(f'<span class="annotation">{ annotation }</span>')
# # print(f'annotationcontainer.contents: { annotationcontainer.contents }')
# # new_annotation = soup.new_annotation("a", href="http://www.example.com")
# new_annotation = soup.new_annotation("span")
# new_annotation.append(annotation)
# soup.find(id=handle).find(class_="annotationcontainer").append(new_annotation)
# print(f'new soup: { str(soup) } ')
# # write soup to file
# with open(log_path, 'w') as l:
# l.write(str(soup))
class MUCBot ( slixmpp . ClientXMPP ) :
@ -148,10 +150,6 @@ class MUCBot(slixmpp.ClientXMPP):
# password=the_room_password,
wait = True )
# NOTE(luke): disabled for now. We'll make it possible to speak to logbot privately later
# Send a message to the room
# self.send_message(mto=self.groupchat, mbody='Hello! RECbot here. I\'m new :). You can log text/image/sound/video messages, by including @bot in your message. Happy logging! PS. you can access the logs at https://vvvvvvaria.org/logs/', mtype='groupchat')
def muc_message ( self , msg ) :
# Some inspection commands
#print('Message: {}'.format(msg))
@ -159,99 +157,118 @@ class MUCBot(slixmpp.ClientXMPP):
# Always check that a message is not the bot itself, otherwise you will create an infinite loop responding to your own messages.
if msg [ ' mucnick ' ] != self . nick :
# Check if output folder exists
if not os . path . exists ( self . output ) :
os . mkdir ( self . output )
if ' @bot ' in msg [ ' body ' ] :
# Send some info about this bot.
self . send_message (
mto = self . groupchat ,
mbody = ''' Hello! RECbot here. I \' m a new version of logbot.
# Check if an OOB URL is included in the stanza (which is how an image is sent)
# (OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob)
if len ( msg [ ' oob ' ] [ ' url ' ] ) > 0 :
You can log type of text messages , by including __ADD__ in your message . Or , you can send an image / sound ( * spark ) / video ( * spark ) file to this chat and it will be logged for you .
# Send a reply
self . send_message ( mto = self . groupchat ,
mbody = " Super, our log is growing. Your image is added! " ,
mtype = ' groupchat ' )
Items in the log can also be deleted again , by using the unique HANDLE of each post . You can find these handles in the generated HTML page , they look like this : + / / - * .
# Save the image to the output folder
url = msg [ ' oob ' ] [ ' url ' ] # grep the url in the message
filename = os . path . basename ( url ) # grep the filename in the url
output_path = os . path . join ( self . output , filename )
u = urllib . request . urlopen ( url ) # read the image data
f = open ( output_path , ' wb ' ) # open the output file
f . write ( u . read ( ) ) # write image to file
f . close ( ) # close the output file
Happy logging !
# Add the image to the log
img = f ' <div class= " entry image " ><img src= " { filename } " ></div> '
write_to_log ( self , img )
PS . you can access these logs at https : / / vvvvvvaria . org / logs / . ''' ,
mtype = ' groupchat '
)
# Include a new post in the log (only when '__ADD__' is used in the message)
if ' __ADD__ ' in msg [ ' body ' ] :
else :
# Respond to incoming __ACTION_WORDS__!
# reply from the bot
self . send_message ( mto = self . groupchat ,
mbody = f ' Noted! And added to the log. Thanks { msg [ " mucnick " ] } ! ' ,
mtype = ' groupchat ' )
# Check if output folder exists
if not os . path . exists ( self . output ) :
os . mkdir ( self . output )
# Add the message to the log!
message = msg [ ' body ' ] . replace ( ' __ADD__ ' , ' ' )
message = f ' <div class= " entry text " > { message } </div> '
write_to_log ( self , message )
# Check if an OOB URL is included in the stanza (which is how an image is sent)
# (OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob)
if len ( msg [ ' oob ' ] [ ' url ' ] ) > 0 :
# Include a new post in the log (only when '__ADD__' is used in the message)
if ' __ANNOTATE__ ' in msg [ ' body ' ] :
# Send a reply
self . send_message ( mto = self . groupchat ,
mbody = " Super, our log is growing. Your image is added! " ,
mtype = ' groupchat ' )
handle = msg [ ' body ' ] . split ( ) [ 1 ]
annotation = msg [ ' body ' ] . replace ( ' __ANNOTATE__ ' , ' ' ) . replace ( handle , ' ' )
post = find_in_soup ( self , handle , annotation )
# Save the image to the output folder
url = msg [ ' oob ' ] [ ' url ' ] # grep the url in the message
filename = os . path . basename ( url ) # grep the filename in the url
output_path = os . path . join ( self . output , filename )
u = urllib . request . urlopen ( url ) # read the image data
f = open ( output_path , ' wb ' ) # open the output file
f . write ( u . read ( ) ) # write image to file
f . close ( ) # close the output file
# reply from the bot
self . send_message ( mto = self . groupchat ,
mbody = " Thanks! " ,
mtype = ' groupchat ' )
# Add the image to the log
img = f ' <div class= " entry image " ><img src= " { filename } " ></div> '
write_to_log ( self , img )
# Check if this is a book ...
if ' __BOOK __ ' in msg [ ' body ' ] :
# Include a new post in the log (only when '__ADD__' is used in the message)
if ' __ADD __ ' in msg [ ' body ' ] :
self . send_message ( mto = self . groupchat ,
mbody = " Oh a book, that ' s cool! Thanks {} ! " . format ( msg [ ' mucnick ' ] ) ,
mtype = ' groupchat ' )
# reply from the bot
self . send_message ( mto = self . groupchat ,
mbody = f ' Noted! And added to the log. Thanks { msg [ " mucnick " ] } ! ' ,
mtype = ' groupchat ' )
# Start of book feature
book = msg [ ' body ' ] . replace ( ' @bot ' , ' ' ) . replace ( ' /book ' , ' ' )
book = re . sub ( ' + ' , ' ' , book ) # remove double spaces
book = book . lstrip ( ) . rstrip ( ) # remove spaces at the beginning and at the end
book = book . replace ( ' ' , ' + ' ) . lower ( ) # turn space into + and lowercase
# Add the message to the log!
message = msg [ ' body ' ] . replace ( ' __ADD__ ' , ' ' )
message = f ' <div class= " entry text " > { message } </div> '
write_to_log ( self , message )
page_link = ' https://www.worldcat.org/search?q= {} &qt=results_page ' . format ( book )
page_response = requests . get ( page_link , timeout = 5 )
page_content = BeautifulSoup ( page_response . content , " html.parser " )
# Include a new post in the log (only when '__ADD__' is used in the message)
if ' __ANNOTATE__ ' in msg [ ' body ' ] :
try :
book_title = page_content . findAll ( " div " , { " class " : " name " } ) [ 0 ] . text
book_author = page_content . findAll ( " div " , { " class " : " author " } ) [ 0 ] . text
book_publisher = page_content . findAll ( " div " , { " class " : " publisher " } ) [ 0 ] . text
handle = msg [ ' body ' ] . split ( ) [ 1 ]
annotation = msg [ ' body ' ] . replace ( ' __ANNOTATE__ ' , ' ' ) . replace ( handle , ' ' )
post = find_in_soup ( self , handle , annotation )
response = ' <b>BOOK</b>: ' + book_title + ' ' + book_author + ' ' + book_publisher
# reply from the bot
self . send_message ( mto = self . groupchat ,
mbody = " Thanks! " ,
mtype = ' groupchat ' )
book_found = True
# Check if this is a book ...
if ' __BOOK__ ' in msg [ ' body ' ] :
except IndexError :
self . send_message ( mto = self . groupchat ,
mbody = " Oh a book, that ' s cool! Thanks {} ! " . format ( msg [ ' mucnick ' ] ) ,
mtype = ' groupchat ' )
book_found = False
# Start of book feature
book = msg [ ' body ' ] . replace ( ' @bot ' , ' ' ) . replace ( ' /book ' , ' ' )
book = re . sub ( ' + ' , ' ' , book ) # remove double spaces
book = book . lstrip ( ) . rstrip ( ) # remove spaces at the beginning and at the end
book = book . replace ( ' ' , ' + ' ) . lower ( ) # turn space into + and lowercase
if book_found :
page_link = ' https://www.worldcat.org/search?q= {} &qt=results_page ' . format ( book )
page_response = requests . get ( page_link , timeout = 5 )
page_content = BeautifulSoup ( page_response . content , " html.parser " )
# Add message to log
message = ' <b>BOOK</b>: ' + book_title + ' ' + book_author + ' ' + book_publisher
message = f ' <div class= " entry book " > { message } </div> '
write_to_log ( self , message )
try :
book_title = page_content . findAll ( " div " , { " class " : " name " } ) [ 0 ] . text
book_author = page_content . findAll ( " div " , { " class " : " author " } ) [ 0 ] . text
book_publisher = page_content . findAll ( " div " , { " class " : " publisher " } ) [ 0 ] . text
response = ' <b>BOOK</b>: ' + book_title + ' ' + book_author + ' ' + book_publisher
book_found = True
except IndexError :
book_found = False
if book_found :
# Add message to log
message = ' <b>BOOK</b>: ' + book_title + ' ' + book_author + ' ' + book_publisher
message = f ' <div class= " entry book " > { message } </div> '
write_to_log ( self , message )
self . send_message ( mto = self . groupchat , mbody = ' Hope this was the book you were looking for: ' + book_title + ' ' + book_author + ' ' + book_publisher , mtype = ' groupchat ' )
self . send_message ( mto = self . groupchat , mbody = ' Hope this was the book you were looking for: ' + book_title + ' ' + book_author + ' ' + book_publisher , mtype = ' groupchat ' )
else :
else :
self . send_message ( mto = self . groupchat , mbody = ' Sorry, no book found! ' , mtype = ' groupchat ' )
self . send_message ( mto = self . groupchat , mbody = ' Sorry, no book found! ' , mtype = ' groupchat ' )
if __name__ == ' __main__ ' :