from setup import Setup from xatapi import Xat from mastodon import Mastodon from post import Post 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("'", "'") s = s.replace("'", "'") 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: post = Post() answer = xat.completions(prompt=prompt) answer = answer.choices[0]['text'] if 'com.example.demo.controller' not in answer: post_array = post.split(answer, username) for postit in post_array: post_id = mastodon.status_post(postit, in_reply_to_id=status_id,visibility=visibility).id status_id = post_id time.sleep(2) print(f'Notification {notification_id} replied') mastodon.notifications_dismiss(notification_id) else: print(f'Notification {notification_id} dissmised') mastodon.notifications_dismiss(notification_id)