@ -52,7 +52,7 @@ def write_to_log(self, entry):
# check if file exists, if not: write it!
# check if file exists, if not: write it!
if not os . path . isfile ( log_path ) :
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 ( )
css_template = open ( ' templates/stylesheet.css ' , ' r ' ) . read ( )
with open ( log_path , ' w ' ) as l :
with open ( log_path , ' w ' ) as l :
l . write ( html_template )
l . write ( html_template )
@ -71,7 +71,6 @@ def write_to_log(self, entry):
< small class = " postid " > { handle } < / small >
< small class = " postid " > { handle } < / small >
{ entry }
{ entry }
< small class = " date " > Added on { now } < / small >
< small class = " date " > Added on { now } < / small >
< small class = " tags " > Tags : < span class = " tagcontainer " > < / span > < / small >
< / div > '''
< / div > '''
print ( f ' Post: { post } ' )
print ( f ' Post: { post } ' )
with open ( log_path , ' a+ ' ) as l :
with open ( log_path , ' a+ ' ) as l :
@ -81,34 +80,37 @@ def write_to_log(self, entry):
h . write ( handle )
h . write ( handle )
print ( ' added to the .handles file! ' )
print ( ' added to the .handles file! ' )
def find_in_soup ( self , handle , tag ) :
# *spark
print ( ' --------ADD TAG --------- ' )
# add annotations
print ( f ' handle: { handle } ' )
log = ' index.html '
# def find_in_soup(self, handle, annotation):
log_path = os . path . join ( self . output , log )
# print('--------ADD ANNOTATION ---------')
html = open ( log_path , ' r ' ) . read ( )
# print(f'handle: { handle }')
soup = BeautifulSoup ( html , ' html.parser ' )
# log = 'index.html'
# print(soup.prettify())
# log_path = os.path.join(self.output, log)
post = soup . find ( id = handle )
# html = open(log_path, 'r').read()
# print(f'posts: { posts }')
# soup = BeautifulSoup(html, 'html.parser')
# for post in posts:
# # print(soup.prettify())
print ( f ' post: { post } ' )
# post = soup.find(id=handle)
if post :
# # print(f'posts: { posts }')
# tagcontainer = post.findChildren(id="tagcontainer", recursive=True)[0]
# # for post in posts:
# print(f'tagcontainer: { tagcontainer }')
# print(f'post: { post }')
# print(f'tagcontainer.contents: { tagcontainer.contents }')
# if post:
# tagcontainer.contents.append(f'<span class="tag">{ tag }</span>')
# # annotationcontainer = post.findChildren(id="annotationcontainer", recursive=True)[0]
# print(f'tagcontainer.contents: { tagcontainer.contents }')
# # print(f'annotationcontainer: { annotationcontainer }')
# # print(f'annotationcontainer.contents: { annotationcontainer.contents }')
# new_tag = soup.new_tag("a", href="http://www.example.com")
# # annotationcontainer.contents.append(f'<span class="annotation">{ annotation }</span>')
new_tag = soup . new_tag ( " span " )
# # print(f'annotationcontainer.contents: { annotationcontainer.contents }')
new_tag . append ( tag )
soup . find ( id = handle ) . find ( class_ = " tagcontainer " ) . append ( new_tag )
# # new_annotation = soup.new_annotation("a", href="http://www.example.com")
print ( f ' new soup: { str ( soup ) } ' )
# new_annotation = soup.new_annotation("span")
# new_annotation.append(annotation)
# write soup to file
# soup.find(id=handle).find(class_="annotationcontainer").append(new_annotation)
with open ( log_path , ' w ' ) as l :
# print(f'new soup: { str(soup) } ')
l . write ( str ( soup ) )
# # write soup to file
# with open(log_path, 'w') as l:
# l.write(str(soup))
class MUCBot ( slixmpp . ClientXMPP ) :
class MUCBot ( slixmpp . ClientXMPP ) :
@ -148,10 +150,6 @@ class MUCBot(slixmpp.ClientXMPP):
# password=the_room_password,
# password=the_room_password,
wait = True )
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 ) :
def muc_message ( self , msg ) :
# Some inspection commands
# Some inspection commands
#print('Message: {}'.format(msg))
#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.
# 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 :
if msg [ ' mucnick ' ] != self . nick :
# Check if output folder exists
if ' @bot ' in msg [ ' body ' ] :
if not os . path . exists ( self . output ) :
# Send some info about this bot.
os . mkdir ( self . output )
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)
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 .
# (OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob)
if len ( msg [ ' oob ' ] [ ' url ' ] ) > 0 :
# Send a reply
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 : + / / - * .
self . send_message ( mto = self . groupchat ,
mbody = " Super, our log is growing. Your image is added! " ,
mtype = ' groupchat ' )
# Save the image to the output folder
Happy logging !
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
# Add the image to the log
PS . you can access these logs at https : / / vvvvvvaria . org / logs / . ''' ,
img = f ' <div class= " entry image " ><img src= " { filename } " ></div> '
mtype = ' groupchat '
write_to_log ( self , img )
)
# Include a new post in the log (only when '__ADD__' is used in the message)
else :
if ' __ADD__ ' in msg [ ' body ' ] :
# Respond to incoming __ACTION_WORDS__!
# reply from the bot
# Check if output folder exists
self . send_message ( mto = self . groupchat ,
if not os . path . exists ( self . output ) :
mbody = f ' Noted! And added to the log. Thanks { msg [ " mucnick " ] } ! ' ,
os . mkdir ( self . output )
mtype = ' groupchat ' )
# Add the message to the log!
# Check if an OOB URL is included in the stanza (which is how an image is sent)
message = msg [ ' body ' ] . replace ( ' __ADD__ ' , ' ' )
# (OOB object - https://xmpp.org/extensions/xep-0066.html#x-oob)
message = f ' <div class= " entry text " > { message } </div> '
if len ( msg [ ' oob ' ] [ ' url ' ] ) > 0 :
write_to_log ( self , message )
# Include a new post in the log (only when '__ADD__' is used in the message)
# Send a reply
if ' __ANNOTATE__ ' in msg [ ' body ' ] :
self . send_message ( mto = self . groupchat ,
mbody = " Super, our log is growing. Your image is added! " ,
mtype = ' groupchat ' )
handle = msg [ ' body ' ] . split ( ) [ 1 ]
# Save the image to the output folder
annotation = msg [ ' body ' ] . replace ( ' __ANNOTATE__ ' , ' ' ) . replace ( handle , ' ' )
url = msg [ ' oob ' ] [ ' url ' ] # grep the url in the message
post = find_in_soup ( self , handle , annotation )
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
# Add the image to the log
self . send_message ( mto = self . groupchat ,
img = f ' <div class= " entry image " ><img src= " { filename } " ></div> '
mbody = " Thanks! " ,
write_to_log ( self , img )
mtype = ' groupchat ' )
# Check if this is a book ...
# Include a new post in the log (only when '__ADD__' is used in the message)
if ' __BOOK __ ' in msg [ ' body ' ] :
if ' __ADD __ ' in msg [ ' body ' ] :
self . send_message ( mto = self . groupchat ,
# reply from the bot
mbody = " Oh a book, that ' s cool! Thanks {} ! " . format ( msg [ ' mucnick ' ] ) ,
self . send_message ( mto = self . groupchat ,
mtype = ' groupchat ' )
mbody = f ' Noted! And added to the log. Thanks { msg [ " mucnick " ] } ! ' ,
mtype = ' groupchat ' )
# Start of book feature
# Add the message to the log!
book = msg [ ' body ' ] . replace ( ' @bot ' , ' ' ) . replace ( ' /book ' , ' ' )
message = msg [ ' body ' ] . replace ( ' __ADD__ ' , ' ' )
book = re . sub ( ' + ' , ' ' , book ) # remove double spaces
message = f ' <div class= " entry text " > { message } </div> '
book = book . lstrip ( ) . rstrip ( ) # remove spaces at the beginning and at the end
write_to_log ( self , message )
book = book . replace ( ' ' , ' + ' ) . lower ( ) # turn space into + and lowercase
page_link = ' https://www.worldcat.org/search?q= {} &qt=results_page ' . format ( book )
# Include a new post in the log (only when '__ADD__' is used in the message)
page_response = requests . get ( page_link , timeout = 5 )
if ' __ANNOTATE__ ' in msg [ ' body ' ] :
page_content = BeautifulSoup ( page_response . content , " html.parser " )
try :
handle = msg [ ' body ' ] . split ( ) [ 1 ]
book_title = page_content . findAll ( " div " , { " class " : " name " } ) [ 0 ] . text
annotation = msg [ ' body ' ] . replace ( ' __ANNOTATE__ ' , ' ' ) . replace ( handle , ' ' )
book_author = page_content . findAll ( " div " , { " class " : " author " } ) [ 0 ] . text
post = find_in_soup ( self , handle , annotation )
book_publisher = page_content . findAll ( " div " , { " class " : " publisher " } ) [ 0 ] . text
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
try :
message = ' <b>BOOK</b>: ' + book_title + ' ' + book_author + ' ' + book_publisher
book_title = page_content . findAll ( " div " , { " class " : " name " } ) [ 0 ] . text
message = f ' <div class= " entry book " > { message } </div> '
book_author = page_content . findAll ( " div " , { " class " : " author " } ) [ 0 ] . text
write_to_log ( self , message )
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__ ' :
if __name__ == ' __main__ ' :