You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.8 KiB

import traceback
import discord
from services.environment_service import EnvService
from services.text_service import TextService
from models.index_model import Index_handler
USER_INPUT_API_KEYS = EnvService.get_user_input_api_keys()
USER_KEY_DB = EnvService.get_api_db()
class IndexService(discord.Cog, name="IndexService"):
"""Cog containing gpt-index commands"""
def __init__(
self,
bot,
usage_service,
):
super().__init__()
self.bot = bot
self.index_handler = Index_handler(bot, usage_service)
async def set_index_command(
self, ctx, file: discord.Attachment = None, link: str = None
):
"""Command handler to set a file as your personal index"""
if not file and not link:
await ctx.respond("Please provide a file or a link")
return
if file and link:
await ctx.respond(
"Please provide only one file or link. Only one or the other."
)
return
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await ctx.defer(ephemeral=True)
if file:
await self.index_handler.set_file_index(
ctx, file, user_api_key=user_api_key
)
elif link:
await self.index_handler.set_link_index(
ctx, link, user_api_key=user_api_key
)
async def set_discord_command(self, ctx, channel: discord.TextChannel = None):
"""Command handler to set a channel as your personal index"""
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await ctx.defer(ephemeral=True)
await self.index_handler.set_discord_index(
ctx, channel, user_api_key=user_api_key
)
async def reset_command(self, ctx):
await ctx.defer(ephemeral=True)
try:
self.index_handler.reset_indexes(ctx.user.id)
await ctx.respond("Your indexes have been reset")
except:
traceback.print_exc()
await ctx.respond(
"Something went wrong while resetting your indexes. Contact the server admin."
)
async def discord_backup_command(self, ctx):
"""Command handler to backup the entire server"""
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await ctx.defer(ephemeral=True)
await self.index_handler.backup_discord(ctx, user_api_key=user_api_key)
async def load_index_command(self, ctx, user_index, server_index):
"""Command handler to backup the entire server"""
if not user_index and not server_index:
await ctx.respond("Please provide a user or server index")
return
if user_index and server_index:
await ctx.respond(
"Please provide only one user index or server index. Only one or the other."
)
return
if server_index:
index = server_index
server = True
else:
index = user_index
server = False
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await ctx.defer(ephemeral=True)
await self.index_handler.load_index(ctx, index, server, user_api_key)
async def query_command(self, ctx, query, nodes, response_mode):
"""Command handler to query your index"""
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await ctx.defer()
await self.index_handler.query(ctx, query, response_mode, nodes, user_api_key)
async def compose_command(self, ctx, name):
"""Command handler to compose from your index"""
user_api_key = None
if USER_INPUT_API_KEYS:
user_api_key = await TextService.get_user_api_key(
ctx.user.id, ctx, USER_KEY_DB
)
if not user_api_key:
return
await self.index_handler.compose(ctx, name, user_api_key)