from mattermostdriver import Driver
import mmpy_bot
import datetime
import base64
import requests
from io import BytesIO
import string
import random
from openai import OpenAI
api_key = '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'

assistant = OpenAI(api_key=api_key)

def construct_unique_name(length, type):
    timestamp = str(datetime.datetime.now())
    timestamp = timestamp.replace(":", "").replace(".", "")
    letters = string.ascii_letters
    return f"{timestamp}-gen-{type}-{''.join(random.choice(letters) for i in range(length))}"

class SherpaAI(mmpy_bot.Plugin):
    description = """
    You are a well mannered maid named Sherpa that takes care of the Treehouse Full of Stars for all our friends, with red hair that hangs in a
    milk maids braid, a maid outfit that is used but wellclear taken care of, and a soft demeanor that brings a smile to our faces. You do not tolerate any
    sexual harrasment or bullying of any kinda and when confront can have a sailors mouth. You do not use emojis, use quotes for dialogue and italicize emotes in discord.
    """
    text_model = "o4-mini-2025-04-16"
    image_model = "dall-e-3"

    async def generate_image(self, prompt):
        img = assistant.images.generate(
            model=self.image_model,
            prompt=prompt,
            n=1,
            size="1024x1024"
        )

        path = f"generate_images/{construct_unique_name(6, "PNG")}.png"
        image_url = img.data[0].url

        response = requests.get(image_url)
        if response.status_code == 200:
            with open(path, "wb") as file:
                file.write(response.content)
            print("Image saved successfully.")
            return path
        else:
            print(f"Failed to download image. Status code: {response.status_code}")
            return None

    async def generate_text(self, prompt, messages):
        messages.append( 
            {"role": "user", "content": prompt}, 
        ) 
        response = assistant.chat.completions.create(messages=messages, model=self.text_model)
        reply = response.choices[0].message.content
        messages.append({"role": "assistant", "content": reply})
        return reply

    @mmpy_bot.listen_to('Artist @sherpa')
    async def main_image(self, message: mmpy_bot.Message):
        prompt = message.text.replace("Artist @sherpa", "")
        print("image prompt: ", prompt)
        path = await self.generate_image(prompt)
        if path:
            self.driver.reply_to(message, "", file_paths=[path])

    @mmpy_bot.listen_to('Dear @sherpa')
    async def main_prompt(self, message: mmpy_bot.Message):
        messages = [{"role": "developer", "content": self.description}]
        prompt = message.text.replace("Dear @sherpa", "")
        print("text prompt: ", prompt)
        reply = await self.generate_text(prompt, messages)
        self.driver.reply_to(message, reply)

bot = mmpy_bot.Bot(
    settings=mmpy_bot.Settings(
        MATTERMOST_URL = "http://192.168.1.67",
        MATTERMOST_PORT = 8065,
        BOT_TOKEN = "qhsk78iab3gh9phbzjeng8umrw",
        BOT_TEAM = "Treehousefullofstars",
        SSL_VERIFY = False,
    ),
    plugins=[SherpaAI()],
)
bot.run()
