Upload 4 files
Browse files- WarOnline_Chat.py +138 -125
- config.py +1 -1
WarOnline_Chat.py
CHANGED
|
@@ -52,12 +52,14 @@ def remove_non_english_russian_chars(s):
|
|
| 52 |
return re.sub(pattern, '', s)
|
| 53 |
|
| 54 |
def remove_extra_spaces(s):
|
|
|
|
| 55 |
s = re.sub(r"\s+", " ", s) # replace all sequences of whitespace with a single space
|
| 56 |
s = re.sub(r"\s+([.,-])", r"\1", s) # remove spaces before period, dash or comma
|
| 57 |
return(s)
|
| 58 |
|
| 59 |
def getLastPage(thread_url=config.thread_url):
|
| 60 |
# Returns the number of the last page
|
|
|
|
| 61 |
page = 1 # Starting page
|
| 62 |
lastPage = False
|
| 63 |
|
|
@@ -66,6 +68,7 @@ def getLastPage(thread_url=config.thread_url):
|
|
| 66 |
page += 1
|
| 67 |
else:
|
| 68 |
lastPage = True
|
|
|
|
| 69 |
return page
|
| 70 |
|
| 71 |
def login(username=config.username, password=config.password, thread_url=config.thread_url):
|
|
@@ -90,6 +93,8 @@ def login(username=config.username, password=config.password, thread_url=config.
|
|
| 90 |
if 'Invalid login' in response.text:
|
| 91 |
print('Login failed!')
|
| 92 |
exit()
|
|
|
|
|
|
|
| 93 |
|
| 94 |
def post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by="",quote_text="",quote_source="",img_url=""):
|
| 95 |
#Post a message to the forum (with or without the quote
|
|
@@ -216,129 +221,133 @@ def getMessages(thread_url=config.thread_url, quotedUser="", startingPage=1):
|
|
| 216 |
|
| 217 |
return allquotes
|
| 218 |
|
| 219 |
-
# Core Engine of the Client
|
| 220 |
def WarOnlineBot():
|
|
|
|
| 221 |
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
if startingPage < 1:
|
| 225 |
-
startingPage = 1 # Starting page cannot be less than 1
|
| 226 |
-
|
| 227 |
-
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
| 228 |
-
#print("logged in")
|
| 229 |
-
|
| 230 |
-
# All messages (with quotes) by ALL users:
|
| 231 |
-
allMessages = getMessages(thread_url=config.thread_url, quotedUser='', startingPage=startingPage)
|
| 232 |
-
|
| 233 |
-
# IDs of the quoted messages, replied by the bot:
|
| 234 |
-
messages_by_bot_IDs = []
|
| 235 |
-
|
| 236 |
-
# Initiate the direct messages
|
| 237 |
-
direct_messages = []
|
| 238 |
-
|
| 239 |
-
for msg in allMessages:
|
| 240 |
-
# Direct message to the bot
|
| 241 |
-
if msg['quotedID'].split(': ')[-1] == '0': #debug
|
| 242 |
-
direct_messages.append(msg)
|
| 243 |
-
# Set a list of replied messages IDs
|
| 244 |
-
if msg['messengerName'] == config.username: #message posted by the WarBot
|
| 245 |
-
messages_by_bot_IDs.append(msg['quotedID'].split(': ')[-1])
|
| 246 |
-
# remove empty and repeated elements
|
| 247 |
-
messages_by_bot_IDs = list(set([elem for elem in messages_by_bot_IDs if elem]))
|
| 248 |
-
|
| 249 |
-
# All messages (with quotes) sent _FOR_ the Bot:
|
| 250 |
-
messagesForBot = getMessages(thread_url=config.thread_url, quotedUser=config.username, startingPage=startingPage)
|
| 251 |
-
|
| 252 |
-
# Append the direct messages to the messagesForBot:
|
| 253 |
-
for msg in direct_messages:
|
| 254 |
-
messagesForBot.append(msg)
|
| 255 |
-
|
| 256 |
-
# IDs of the messages, quoting the bot:
|
| 257 |
-
messages_for_bot_IDs = []
|
| 258 |
-
|
| 259 |
-
for msg in messagesForBot:
|
| 260 |
-
# Set a list of posted message IDs
|
| 261 |
-
messages_for_bot_IDs.append(msg['messageID'].split('-')[-1])
|
| 262 |
-
# remove empty elements
|
| 263 |
-
messages_for_bot_IDs = [elem for elem in messages_for_bot_IDs if elem]
|
| 264 |
-
|
| 265 |
-
# Filter to leave just the unanswered messages IDs:
|
| 266 |
-
messages_for_bot_IDs = [ID for ID in messages_for_bot_IDs if ID not in messages_by_bot_IDs]
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
# Reply the unanswered messages:
|
| 270 |
-
for msg in messagesForBot:
|
| 271 |
-
if msg['messageID'].split('-')[-1] in messages_for_bot_IDs:
|
| 272 |
-
|
| 273 |
-
originalQuote = msg['reply']
|
| 274 |
-
if originalQuote == "": # Just images, no text
|
| 275 |
-
continue
|
| 276 |
-
else:
|
| 277 |
-
quote = remove_non_english_russian_chars(msg['reply'])
|
| 278 |
-
quote = remove_extra_spaces(quote)
|
| 279 |
-
|
| 280 |
-
message = "" #Initiating the reply message by Bot
|
| 281 |
-
previous_dialogue = "" #Initiating the previous dialogue
|
| 282 |
-
|
| 283 |
-
print('Quote: ', originalQuote)
|
| 284 |
-
|
| 285 |
-
# Init Connection
|
| 286 |
-
db = conversationDB.DataBase()
|
| 287 |
-
|
| 288 |
-
if msg['quotedID'].split(': ')[-1] != '0': # It is dialogue. Look-up for the previous quotes
|
| 289 |
-
|
| 290 |
-
# Get the previous dialogue from the database
|
| 291 |
-
dbmessages = db.getmessages(msg['messengerName'])
|
| 292 |
-
for dbmessage in dbmessages:
|
| 293 |
-
previous_dialogue += dbmessage[0]+' '+dbmessage[1]+' '
|
| 294 |
-
# Update the string and preprocess it
|
| 295 |
-
quote = previous_dialogue + quote
|
| 296 |
-
quote = remove_non_english_russian_chars(quote)
|
| 297 |
-
quote = remove_extra_spaces(quote)
|
| 298 |
-
# Truncate the quote to return only the last MaxWords of words:
|
| 299 |
-
quote = " ".join(quote.split()[-config.MaxWords:])
|
| 300 |
-
|
| 301 |
-
# Fix the quote string, to eliminate errors:
|
| 302 |
-
quote = fixString(quote)
|
| 303 |
-
|
| 304 |
-
FailureCounter = 0 # In case there is a bug in the model
|
| 305 |
-
while (not message) and (FailureCounter<3):
|
| 306 |
-
message = WarClient.getReply(message=quote)
|
| 307 |
-
# Strange error in message if there is '02' in the message text.
|
| 308 |
-
if '02' in message:
|
| 309 |
-
message = ""
|
| 310 |
-
FailureCounter+=1
|
| 311 |
-
|
| 312 |
-
if FailureCounter == 3:
|
| 313 |
-
continue # Skip that answer
|
| 314 |
-
|
| 315 |
-
# Post-processing fixes:
|
| 316 |
-
message = fixString(message)
|
| 317 |
-
print('Reply: ', message)
|
| 318 |
-
|
| 319 |
-
if message.endswith('.png'): # It is an image reply:
|
| 320 |
-
# Post an image reply:
|
| 321 |
-
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
| 322 |
-
time.sleep(1)
|
| 323 |
-
post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by=msg['messengerName'],
|
| 324 |
-
quote_text=originalQuote, quote_source=msg['messageID'],
|
| 325 |
-
img_url=message)
|
| 326 |
-
# will not be added to the database, if image is a reply
|
| 327 |
-
|
| 328 |
-
else:
|
| 329 |
-
|
| 330 |
-
# Add the new conversation pair to the database
|
| 331 |
-
db.setmessages(username=msg['messengerName'], message_text=originalQuote, bot_reply=message)
|
| 332 |
-
# Clean up the excessive records, leaving only the remaining messages
|
| 333 |
-
db.cleanup(username=msg['messengerName'], remaining_messages=config.remaining_messages)
|
| 334 |
-
# Delete the duplicate records
|
| 335 |
-
db.deleteDuplicates()
|
| 336 |
-
|
| 337 |
-
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
| 338 |
-
time.sleep(1)
|
| 339 |
-
post(message=message, thread_url=config.thread_url, post_url=config.post_url, quoted_by=msg['messengerName'], quote_text=originalQuote, quote_source=msg['messageID'])
|
| 340 |
|
| 341 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 342 |
|
| 343 |
|
| 344 |
if __name__ == '__main__':
|
|
@@ -346,7 +355,7 @@ if __name__ == '__main__':
|
|
| 346 |
# Start the scheduler
|
| 347 |
while True:
|
| 348 |
print('Starting Session')
|
| 349 |
-
WarOnlineBot()
|
| 350 |
|
| 351 |
# Debug Only:
|
| 352 |
#imgWord = 'как выглядит'
|
|
@@ -356,8 +365,12 @@ if __name__ == '__main__':
|
|
| 356 |
post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by='Test',
|
| 357 |
quote_text="posting an image",img_url='https://replicate.delivery/pbxt/knKBiJt8DPZ0B1o25PaLJSZjgv3D5HcwLoBIn0JESbe3nISIA/out-0.png')
|
| 358 |
"""
|
| 359 |
-
|
|
|
|
| 360 |
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
return re.sub(pattern, '', s)
|
| 53 |
|
| 54 |
def remove_extra_spaces(s):
|
| 55 |
+
# Removes extra whitespaces and unwanted characters
|
| 56 |
s = re.sub(r"\s+", " ", s) # replace all sequences of whitespace with a single space
|
| 57 |
s = re.sub(r"\s+([.,-])", r"\1", s) # remove spaces before period, dash or comma
|
| 58 |
return(s)
|
| 59 |
|
| 60 |
def getLastPage(thread_url=config.thread_url):
|
| 61 |
# Returns the number of the last page
|
| 62 |
+
print('looking for the last page of the thread')
|
| 63 |
page = 1 # Starting page
|
| 64 |
lastPage = False
|
| 65 |
|
|
|
|
| 68 |
page += 1
|
| 69 |
else:
|
| 70 |
lastPage = True
|
| 71 |
+
print('Last page of this thread is '+str(page))
|
| 72 |
return page
|
| 73 |
|
| 74 |
def login(username=config.username, password=config.password, thread_url=config.thread_url):
|
|
|
|
| 93 |
if 'Invalid login' in response.text:
|
| 94 |
print('Login failed!')
|
| 95 |
exit()
|
| 96 |
+
else:
|
| 97 |
+
print('Login successful')
|
| 98 |
|
| 99 |
def post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by="",quote_text="",quote_source="",img_url=""):
|
| 100 |
#Post a message to the forum (with or without the quote
|
|
|
|
| 221 |
|
| 222 |
return allquotes
|
| 223 |
|
|
|
|
| 224 |
def WarOnlineBot():
|
| 225 |
+
# Core Engine of the Client
|
| 226 |
|
| 227 |
+
try: # Try logging in
|
| 228 |
+
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
|
| 230 |
+
lookUpPages = 5 # How many pages back to look in the thread
|
| 231 |
+
startingPage = getLastPage(thread_url=config.thread_url) - lookUpPages
|
| 232 |
+
if startingPage < 1:
|
| 233 |
+
startingPage = 1 # Starting page cannot be less than 1
|
| 234 |
+
|
| 235 |
+
# All messages (with quotes) by ALL users:
|
| 236 |
+
allMessages = getMessages(thread_url=config.thread_url, quotedUser='', startingPage=startingPage)
|
| 237 |
+
|
| 238 |
+
# IDs of the quoted messages, replied by the bot:
|
| 239 |
+
messages_by_bot_IDs = []
|
| 240 |
+
|
| 241 |
+
# Initiate the direct messages
|
| 242 |
+
direct_messages = []
|
| 243 |
+
|
| 244 |
+
for msg in allMessages:
|
| 245 |
+
# Direct message to the bot
|
| 246 |
+
if msg['quotedID'].split(': ')[-1] == '0': #debug
|
| 247 |
+
direct_messages.append(msg)
|
| 248 |
+
# Set a list of replied messages IDs
|
| 249 |
+
if msg['messengerName'] == config.username: #message posted by the WarBot
|
| 250 |
+
messages_by_bot_IDs.append(msg['quotedID'].split(': ')[-1])
|
| 251 |
+
# remove empty and repeated elements
|
| 252 |
+
messages_by_bot_IDs = list(set([elem for elem in messages_by_bot_IDs if elem]))
|
| 253 |
+
|
| 254 |
+
# All messages (with quotes) sent _FOR_ the Bot:
|
| 255 |
+
messagesForBot = getMessages(thread_url=config.thread_url, quotedUser=config.username, startingPage=startingPage)
|
| 256 |
+
|
| 257 |
+
# Append the direct messages to the messagesForBot:
|
| 258 |
+
for msg in direct_messages:
|
| 259 |
+
messagesForBot.append(msg)
|
| 260 |
+
|
| 261 |
+
# IDs of the messages, quoting the bot:
|
| 262 |
+
messages_for_bot_IDs = []
|
| 263 |
+
|
| 264 |
+
for msg in messagesForBot:
|
| 265 |
+
# Set a list of posted message IDs
|
| 266 |
+
messages_for_bot_IDs.append(msg['messageID'].split('-')[-1])
|
| 267 |
+
# remove empty elements
|
| 268 |
+
messages_for_bot_IDs = [elem for elem in messages_for_bot_IDs if elem]
|
| 269 |
+
|
| 270 |
+
# Filter to leave just the unanswered messages IDs:
|
| 271 |
+
messages_for_bot_IDs = [ID for ID in messages_for_bot_IDs if ID not in messages_by_bot_IDs]
|
| 272 |
+
|
| 273 |
+
|
| 274 |
+
# Reply the unanswered messages:
|
| 275 |
+
for msg in messagesForBot:
|
| 276 |
+
if msg['messageID'].split('-')[-1] in messages_for_bot_IDs:
|
| 277 |
+
|
| 278 |
+
originalQuote = msg['reply']
|
| 279 |
+
if originalQuote == "": # Just images, no text
|
| 280 |
+
continue
|
| 281 |
+
else:
|
| 282 |
+
quote = remove_non_english_russian_chars(msg['reply'])
|
| 283 |
+
quote = remove_extra_spaces(quote)
|
| 284 |
+
|
| 285 |
+
message = "" #Initiating the reply message by Bot
|
| 286 |
+
previous_dialogue = "" #Initiating the previous dialogue
|
| 287 |
+
|
| 288 |
+
print('Quote: ', originalQuote)
|
| 289 |
+
|
| 290 |
+
# Init Connection
|
| 291 |
+
db = conversationDB.DataBase()
|
| 292 |
+
|
| 293 |
+
if msg['quotedID'].split(': ')[-1] != '0': # It is dialogue. Look-up for the previous quotes
|
| 294 |
+
|
| 295 |
+
# Get the previous dialogue from the database
|
| 296 |
+
dbmessages = db.getmessages(msg['messengerName'])
|
| 297 |
+
for dbmessage in dbmessages:
|
| 298 |
+
previous_dialogue += dbmessage[0]+' '+dbmessage[1]+' '
|
| 299 |
+
# Update the string and preprocess it
|
| 300 |
+
quote = previous_dialogue + quote
|
| 301 |
+
quote = remove_non_english_russian_chars(quote)
|
| 302 |
+
quote = remove_extra_spaces(quote)
|
| 303 |
+
# Truncate the quote to return only the last MaxWords of words:
|
| 304 |
+
quote = " ".join(quote.split()[-config.MaxWords:])
|
| 305 |
+
|
| 306 |
+
# Fix the quote string, to eliminate errors:
|
| 307 |
+
quote = fixString(quote)
|
| 308 |
+
|
| 309 |
+
FailureCounter = 0 # In case there is a bug in the model
|
| 310 |
+
while (not message) and (FailureCounter<3):
|
| 311 |
+
message = WarClient.getReply(message=quote)
|
| 312 |
+
# Strange error in message if there is '02' in the message text.
|
| 313 |
+
if '02' in message:
|
| 314 |
+
message = ""
|
| 315 |
+
FailureCounter+=1
|
| 316 |
+
|
| 317 |
+
if FailureCounter == 3:
|
| 318 |
+
continue # Skip that answer
|
| 319 |
+
|
| 320 |
+
# Post-processing fixes:
|
| 321 |
+
message = fixString(message)
|
| 322 |
+
print('Reply: ', message)
|
| 323 |
+
|
| 324 |
+
if message.endswith('.png'): # It is an image reply:
|
| 325 |
+
# Post an image reply:
|
| 326 |
+
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
| 327 |
+
time.sleep(1)
|
| 328 |
+
post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by=msg['messengerName'],
|
| 329 |
+
quote_text=originalQuote, quote_source=msg['messageID'],
|
| 330 |
+
img_url=message)
|
| 331 |
+
# will not be added to the database, if image is a reply
|
| 332 |
+
|
| 333 |
+
else:
|
| 334 |
+
|
| 335 |
+
# Add the new conversation pair to the database
|
| 336 |
+
db.setmessages(username=msg['messengerName'], message_text=originalQuote, bot_reply=message)
|
| 337 |
+
# Clean up the excessive records, leaving only the remaining messages
|
| 338 |
+
db.cleanup(username=msg['messengerName'], remaining_messages=config.remaining_messages)
|
| 339 |
+
# Delete the duplicate records
|
| 340 |
+
db.deleteDuplicates()
|
| 341 |
+
|
| 342 |
+
login(username=config.username, password=config.password, thread_url=config.thread_url)
|
| 343 |
+
time.sleep(1)
|
| 344 |
+
post(message=message, thread_url=config.thread_url, post_url=config.post_url, quoted_by=msg['messengerName'], quote_text=originalQuote, quote_source=msg['messageID'])
|
| 345 |
+
|
| 346 |
+
time.sleep(10) # Standby time for server load release
|
| 347 |
+
return 0 # All is good
|
| 348 |
+
except:
|
| 349 |
+
print('Bad Connection')
|
| 350 |
+
return -1 # Error
|
| 351 |
|
| 352 |
|
| 353 |
if __name__ == '__main__':
|
|
|
|
| 355 |
# Start the scheduler
|
| 356 |
while True:
|
| 357 |
print('Starting Session')
|
| 358 |
+
result = WarOnlineBot()
|
| 359 |
|
| 360 |
# Debug Only:
|
| 361 |
#imgWord = 'как выглядит'
|
|
|
|
| 365 |
post(message="", thread_url=config.thread_url, post_url=config.post_url, quoted_by='Test',
|
| 366 |
quote_text="posting an image",img_url='https://replicate.delivery/pbxt/knKBiJt8DPZ0B1o25PaLJSZjgv3D5HcwLoBIn0JESbe3nISIA/out-0.png')
|
| 367 |
"""
|
| 368 |
+
if result == 0: # Good result
|
| 369 |
+
print('Session finished. Timeout...')
|
| 370 |
|
| 371 |
+
timer = range(60 * config.timeout)
|
| 372 |
+
for t in timer:
|
| 373 |
+
time.sleep(1)
|
| 374 |
+
else:
|
| 375 |
+
# Rerunning Session
|
| 376 |
+
time.sleep(10) # Standby time for server load release
|
config.py
CHANGED
|
@@ -35,7 +35,7 @@ MaxWords = 50 # The server is relatively weak to fast-process the long messages
|
|
| 35 |
remaining_messages = 2
|
| 36 |
|
| 37 |
# Time between the reply sessions:
|
| 38 |
-
timeout =
|
| 39 |
|
| 40 |
# Call for image generation:
|
| 41 |
imgWord = 'как выглядит'
|
|
|
|
| 35 |
remaining_messages = 2
|
| 36 |
|
| 37 |
# Time between the reply sessions:
|
| 38 |
+
timeout = 3 # min
|
| 39 |
|
| 40 |
# Call for image generation:
|
| 41 |
imgWord = 'как выглядит'
|