xat/mastobot.py
2023-01-22 17:28:40 +01:00

177 líneas
4,1 KiB
Python

from setup import Setup
from xatapi import Xat
from mastodon import Mastodon
import re
import time
import sys
import pdb
def cleanhtml(raw_html):
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, '', raw_html)
return cleantext
def unescape(s):
s = s.replace("&apos;", "'")
return s
def replying():
reply = False
content = cleanhtml(text)
content = unescape(content)
try:
start = content.index("@")
end = content.index(" ")
if len(content) > end:
content = content[0: start:] + content[end +1::]
neteja = content.count('@')
i = 0
while i < neteja :
start = content.rfind("@")
end = len(content)
content = content[0: start:] + content[end +1::]
i += 1
question = content.lower()
query_word = question
reply = True
return (reply, query_word)
except ValueError as v_error:
print(v_error)
query_word = ''
return (reply, query_word)
if __name__ == '__main__':
setup = Setup()
xat = Xat()
mastodon = Mastodon(
access_token = setup.mastodon_app_token,
api_base_url= setup.mastodon_hostname
)
bot_id = mastodon.me().id
notifications = mastodon.notifications()
if len(notifications) == 0:
print('No mentions')
sys.exit(0)
for notif in notifications:
notification_id = notif.id
if notif.type != 'mention':
print(f'dismissing notification {notification_id}')
mastodon.notifications_dismiss(notification_id)
continue
account_id = notif.account.id
username = notif.account.acct
status_id = notif.status.id
text = notif.status.content
visibility = notif.status.visibility
reply, query_word = replying()
if reply == True:
answer = xat.completions(prompt=query_word)
answer = answer.choices[0]['text']
if 'com.example.demo.controller' not in answer:
post_text = f'@{username} {answer}'
if len(post_text) > 500:
len_post1 = 500 - len(username) - 4
post_text1 = post_text[:len_post1] + '... '
post_text2 = f'@{username} ...{post_text[len_post1:]}'
if len(post_text2) > 500:
len_post2 = 500 - len(username) - 8
post_text2 = f'{post_text2[:len_post2]}...'
post_text3 = f'@{username} ...{post_text2[len_post2:]}'
try:
post_id = mastodon.status_post(post_text1, in_reply_to_id=status_id,visibility=visibility).id
post_id = mastodon.status_post(post_text2, in_reply_to_id=post_id,visibility=visibility).id
mastodon.status_post(post_text3, in_reply_to_id=post_id,visibility=visibility)
except:
print(f'Notification {notification_id} dissmised')
mastodon.notifications_dismiss(notification_id)
pass
else:
post_id = mastodon.status_post(post_text1, in_reply_to_id=status_id,visibility=visibility).id
mastodon.status_post(post_text2, in_reply_to_id=post_id,visibility=visibility)
else:
try:
mastodon.status_post(post_text, in_reply_to_id=status_id,visibility=visibility)
except:
print(f'Notification {notification_id} dissmised')
mastodon.notifications_dismiss(notification_id)
pass
time.sleep(5)
print(f'Notification {notification_id} replied')
mastodon.notifications_dismiss(notification_id)
else:
print(f'Notification {notification_id} dissmised')
mastodon.notifications_dismiss(notification_id)