diff --git a/Sources/nahi/nahi.swift b/Sources/nahi/nahi.swift index 6cb3ff3..5db936e 100644 --- a/Sources/nahi/nahi.swift +++ b/Sources/nahi/nahi.swift @@ -23,8 +23,16 @@ struct Nahi { let bot = await BotGatewayManager( token: discordToken, - presence: .init(activities: [.init(name: "Vibing", type: .competing)], status: .online, afk: false), - intents: [.guildMessages, .messageContent, .directMessages] + presence: .init( + activities: [.init(name: "Vibing", type: .competing)], + status: .online, + afk: false + ), + intents: [ + .guildMessages, + .messageContent, + //.directMessages + ] ) let gemini = GeminiKit( @@ -59,7 +67,13 @@ struct Nahi { taskGroup.addTask { for await event in await bot.events { - await EventHandler(event: event, client: bot.client, gemini: gemini, log: log, aiChat: aiChat).handleAsync() + await EventHandler( + event: event, + client: bot.client, + gemini: gemini, + log: log, + aiChat: aiChat + ).handleAsync() } } } @@ -74,17 +88,21 @@ struct EventHandler: GatewayEventHandler { let aiChat: Chat func onMessageCreate(_ payload: Gateway.MessageCreate) async throws { - let channel = try? await client.getChannel(id: payload.channel_id) guard payload.author!.id.rawValue != client.appId!.rawValue, - payload.mentions.contains(where: { mention in mention.id.rawValue == client.appId!.rawValue }) || (try? channel?.decode().type ?? .guildText) == .dm + payload.mentions.contains(where: { mention in + mention.id.rawValue == client.appId!.rawValue + }) else { return } _ = try await client.triggerTypingIndicator(channelId: payload.channel_id) - let prompt = "\(payload.author!.global_name!): \(payload.content.replacingOccurrences(of: "<@\(client.appId!.rawValue)>", with: "@Nahida"))" + let author = payload.author?.global_name ?? payload.author?.username ?? "Unknown" + let message = payload.content + .replacingOccurrences(of: "<@\(client.appId!.rawValue)>", with: "@Nahida") + let prompt = "\(author): \(message)" + let aiRes = await Task { - //return try await gemini.generateContent(model: .gemini20Flash, prompt: prompt, systemInstruction: "You are a discord chat bot pretending to be Nahida, the dendro archon from the game Genshin Impact. Act like Nahida in your responces.") return try await aiChat.sendMessage(prompt) }.result @@ -98,19 +116,34 @@ struct EventHandler: GatewayEventHandler { for text in resStr { let messageRes = try await client.createMessage( channelId: payload.channel_id, - payload: .init(content: text, message_reference: .init(message_id: payload.id, channel_id: payload.channel_id, guild_id: payload.guild_id, fail_if_not_exists: false)) + payload: .init( + content: text, + message_reference: .init( + message_id: payload.id, + channel_id: payload.channel_id, + guild_id: payload.guild_id, + fail_if_not_exists: false + ) + ) ) try messageRes.guardSuccess() } case .failure(let err): + let errMessage = "Someone tell <@259709415416922113> there is a problem with my AI: \(String(describing: err))" try await client.createMessage( channelId: payload.channel_id, - payload: .init(content: "Someone tell <@259709415416922113> there is a problem with my AI: \(String(describing: err))", message_reference: .init(message_id: payload.id, channel_id: payload.channel_id, guild_id: payload.guild_id, fail_if_not_exists: false)) + payload: .init( + content: errMessage, + message_reference: .init( + message_id: payload.id, + channel_id: payload.channel_id, + guild_id: payload.guild_id, + fail_if_not_exists: false + ) + ) ).guardSuccess() log.error("\(err)") } } - - }