xat/mastobot.py
2023-01-26 13:11:36 +01:00

218 líneas
5,4 KiB
Python

from setup import Setup
from xatapi import Xat
from mastodon import Mastodon
import re
import time
import sys
import os
import requests
import base64
import pdb
def cleanhtml(raw_html):
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, '', raw_html)
return cleantext
def unescape(s):
s = s.replace("&apos;", "'")
s = s.replace("&#39;", "'")
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:
prompt = unescape(query_word)
if prompt[:7] == 'imatge:':
try:
imatge = xat.create_image(prompt=prompt[7:])
if not 'error' in imatge:
with open("images/imatge.png", "wb") as fh:
fh.write(base64.b64decode(imatge['data'][0]['b64_json']))
post_text = f'@{username} {prompt[8:]}'
image_id = mastodon.media_post('images/imatge.png', "image/png", description=prompt[8:]).id
mastodon.status_post(post_text, in_reply_to_id=status_id, media_ids={image_id}, visibility=visibility)
else:
post_text = f'@{username} {prompt[8:]}'
post_text += f"\n\n{imatge['error']['message']}"
mastodon.status_post(post_text, in_reply_to_id=status_id, visibility=visibility)
except:
pass
post_text = f'@{username} {prompt[8:]}\n\n{imatge}'
mastodon.status_post(post_text, in_reply_to_id=status_id, visibility=visibility)
else:
answer = xat.completions(prompt=prompt)
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)