@ -1,61 +1,79 @@
#!/usr/bin/python3
""" Bitmessage AutoResponder """
import base64
import configparser
import json
import os
import time
import xmlrpc lib
import xmlrpc . client
class BitmessageAutoresponder ( ) :
class BitmessageAutoresponder ( ) : # pylint: disable=too-many-locals
""" Sending and receiving messages through autoresponder """
config = configparser . ConfigParser ( )
db_var = os . path . join ( os . environ [ " HOME " ] , ' .config/PyBitmessage/credentials.ini ' )
db_var = os . path . join ( os . environ [ " HOME " ] ,
' .config/PyBitmessage/autoresponder.conf ' )
config . read ( db_var )
apiport = config [ ' sqlite3 ' ] [ ' apiport ' ]
apiinterface = config [ ' sqlite3 ' ] [ ' apiinterface ' ]
apiusername = config [ ' sqlite3 ' ] [ ' apiusername ' ]
apipassword = config [ ' sqlite3 ' ] [ ' apipassword ' ]
api = xmlrpclib . ServerProxy ( " http:// %s : %s @ %s : %s / " % ( apiusername , apipassword , apiinterface , apiport ) )
api = xmlrpc . client . ServerProxy (
" http:// %s : %s @ %s : %s / "
% ( apiusername , apipassword , apiinterface , apiport ) )
expire = 300
myaddress_path = os . path . join ( os . environ [ " HOME " ] , ' .config/PyBitmessage/keys.dat ' )
label = " Autoresponder "
def __init__ ( self ) :
self . addresses = { }
self . track = { }
def init_address ( self ) :
""" generate random address if there isn ' t one """
try :
addresses = json . loads ( self . api . listAddresses ( ) ) [ ' addresses ' ]
if addresses :
return
except KeyError :
pass
self . api . createRandomAddress ( base64 . b64encode (
self . label . encode ( ) ) . decode ( ' ascii ' ) )
def loop ( self ) :
""" Main loop """
for i in json . loads ( self . api . listAddresses ( ) ) [ ' addresses ' ] :
self . addresses [ i [ ' address ' ] ] = True
def send_autorepond_inbox_message ( self ) :
""" Sending Auto Message To The Recipient """
track = { }
open_file = open ( self . myaddress_path )
get_file = open_file . read ( )
split_file = get_file . split ( " \n " )
for lines in split_file :
if len ( lines ) == 39 :
if " [ " in lines :
set_address = lines . strip ( " [] " )
while True :
inboxmessages = json . loads ( self . api . getAllInboxMessages ( ) )
inbox_var = inboxmessages . get ( ' inboxMessages ' )
currenttime = time . time ( )
for values in inbox_var :
msgid = values . get ( ' msgid ' )
toaddress = values . get ( ' fromAddress ' )
fromaddress = values . get ( ' toAddress ' )
subject = values . get ( ' subject ' )
message = values . get ( ' message ' )
try :
if time . time ( ) < track [ toaddress ] :
continue
except KeyError :
pass
if set_address == toaddress :
continue
self . api . sendMessage ( toaddress , fromaddress , subject , message )
self . api . trashMessage ( msgid )
track [ toaddress ] = currenttime + self . expire
list_of_time_track = list ( key for ( key , value ) in track . items ( ) if value < currenttime )
for address in list_of_time_track :
track . pop ( address )
self . delete_outbox_message ( )
self . process_inbox_messages ( )
self . cleanup_tracking ( )
self . delete_outbox_messages ( )
time . sleep ( 10 )
def delete_outbox_message ( self ) :
""" Deleting Messages from Outbox Having Status ackreceived or msgsentnoackexpected """
def process_inbox_messages ( self ) :
""" Loop inbox and process messages """
inboxmessages = json . loads ( self . api . getAllInboxMessages ( ) )
inbox_var = inboxmessages . get ( ' inboxMessages ' )
for values in inbox_var :
msgid = values . get ( ' msgid ' )
toaddress = values . get ( ' fromAddress ' )
fromaddress = values . get ( ' toAddress ' )
subject = values . get ( ' subject ' )
message = values . get ( ' message ' )
try :
if time . time ( ) < self . track [ toaddress ] :
continue
except KeyError :
pass
if toaddress in self . addresses :
continue
self . api . sendMessage ( toaddress , fromaddress , subject , message )
self . api . trashMessage ( msgid )
self . track [ toaddress ] = time . time ( ) + self . expire
def delete_outbox_messages ( self ) :
""" Deleting Messages from outbox having status
ackreceived or msgsentnoackexpected """
sentmessage = json . loads ( self . api . getAllSentMessages ( ) )
sent_var = sentmessage . get ( ' sentMessages ' )
for values in sent_var :
@ -64,5 +82,16 @@ class BitmessageAutoresponder():
if status_ack_rcvd in ( ' ackreceived ' , ' msgsentnoackexpected ' ) :
self . api . trashSentMessageByAckData ( ackdata )
def cleanup_tracking ( self ) :
""" Expire old tracking data """
currenttime = time . time ( )
list_of_time_track = list (
key for ( key , value )
in self . track . items ( ) if value < currenttime )
for address in list_of_time_track :
self . track . pop ( address )
if __name__ == ' __main__ ' :
BitmessageAutoresponder ( ) . send_autorepond_inbox_message ( )
BitmessageAutoresponder ( ) . init_address ( )
BitmessageAutoresponder ( ) . loop ( )