diff --git a/.gitignore b/.gitignore index 5f2863b..21238dc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,8 @@ vendor/ bot.log # Database file -bot.db \ No newline at end of file +bot.db + +# All config files except for the default +config/* +!config/default.json \ No newline at end of file diff --git a/anthropic.go b/anthropic.go index 0417140..84869ba 100644 --- a/anthropic.go +++ b/anthropic.go @@ -8,23 +8,31 @@ import ( ) func (b *Bot) getAnthropicResponse(ctx context.Context, messages []anthropic.Message, isNewChat, isAdminOrOwner bool) (string, error) { + // Use prompts from config var systemMessage string if isNewChat { - systemMessage = "You are a helpful AI assistant." + systemMessage = b.config.SystemPrompts["new_chat"] } else { - systemMessage = "Continue the conversation." + systemMessage = b.config.SystemPrompts["continue_conversation"] } + // Combine default prompt with custom instructions + systemMessage = b.config.SystemPrompts["default"] + " " + b.config.SystemPrompts["custom_instructions"] + " " + systemMessage + if !isAdminOrOwner { - systemMessage += " Avoid discussing sensitive topics or providing harmful information." + systemMessage += " " + b.config.SystemPrompts["avoid_sensitive"] } // Ensure the roles are correct for i := range messages { - if messages[i].Role == "user" { + switch messages[i].Role { + case anthropic.RoleUser: messages[i].Role = anthropic.RoleUser - } else if messages[i].Role == "assistant" { + case anthropic.RoleAssistant: messages[i].Role = anthropic.RoleAssistant + default: + // Default to 'user' if role is unrecognized + messages[i].Role = anthropic.RoleUser } } diff --git a/bot.db b/bot.db deleted file mode 100644 index f0d3c3c..0000000 Binary files a/bot.db and /dev/null differ diff --git a/bot.go b/bot.go index 64c2845..849204a 100644 --- a/bot.go +++ b/bot.go @@ -3,6 +3,8 @@ package main import ( "context" "errors" + "fmt" + "log" "os" "sync" "time" @@ -20,12 +22,26 @@ type Bot struct { chatMemories map[int64]*ChatMemory memorySize int chatMemoriesMu sync.RWMutex - config Config + config BotConfig userLimiters map[int64]*userLimiter userLimitersMu sync.RWMutex + clock Clock + botID uint // Reference to BotModel.ID } -func NewBot(db *gorm.DB, config Config) (*Bot, error) { +func NewBot(db *gorm.DB, config BotConfig, clock Clock) (*Bot, error) { + // Retrieve or create Bot entry in the database + var botEntry BotModel + err := db.Where("identifier = ?", config.ID).First(&botEntry).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + botEntry = BotModel{Identifier: config.ID, Name: config.ID} // Customize as needed + if err := db.Create(&botEntry).Error; err != nil { + return nil, err + } + } else if err != nil { + return nil, err + } + anthropicClient := anthropic.NewClient(os.Getenv("ANTHROPIC_API_KEY")) b := &Bot{ @@ -35,9 +51,11 @@ func NewBot(db *gorm.DB, config Config) (*Bot, error) { memorySize: config.MemorySize, config: config, userLimiters: make(map[int64]*userLimiter), + clock: clock, + botID: botEntry.ID, // Ensure BotModel has ID field } - tgBot, err := initTelegramBot(b.handleUpdate) + tgBot, err := initTelegramBot(config.TelegramToken, b.handleUpdate) if err != nil { return nil, err } @@ -71,18 +89,27 @@ func (b *Bot) getOrCreateUser(userID int64, username string) (User, error) { } func (b *Bot) createMessage(chatID, userID int64, username, userRole, text string, isUser bool) Message { - return Message{ + message := Message{ ChatID: chatID, - UserID: userID, - Username: username, UserRole: userRole, Text: text, Timestamp: time.Now(), IsUser: isUser, } + + if isUser { + message.UserID = userID + message.Username = username + } else { + message.UserID = 0 + message.Username = "AI Assistant" + } + + return message } func (b *Bot) storeMessage(message Message) error { + message.BotID = b.botID // Associate the message with the correct bot return b.db.Create(&message).Error } @@ -92,16 +119,23 @@ func (b *Bot) getOrCreateChatMemory(chatID int64) *ChatMemory { b.chatMemoriesMu.RUnlock() if !exists { - var messages []Message - b.db.Where("chat_id = ?", chatID).Order("timestamp asc").Limit(b.memorySize * 2).Find(&messages) - - chatMemory = &ChatMemory{ - Messages: messages, - Size: b.memorySize * 2, - } - b.chatMemoriesMu.Lock() - b.chatMemories[chatID] = chatMemory + // Double-check to prevent race condition + chatMemory, exists = b.chatMemories[chatID] + if !exists { + var messages []Message + b.db.Where("chat_id = ? AND bot_id = ?", chatID, b.botID). + Order("timestamp asc"). + Limit(b.memorySize * 2). + Find(&messages) + + chatMemory = &ChatMemory{ + Messages: messages, + Size: b.memorySize * 2, + } + + b.chatMemories[chatID] = chatMemory + } b.chatMemoriesMu.Unlock() } @@ -140,7 +174,7 @@ func (b *Bot) prepareContextMessages(chatMemory *ChatMemory) []anthropic.Message func (b *Bot) isNewChat(chatID int64) bool { var count int64 - b.db.Model(&Message{}).Where("chat_id = ?", chatID).Count(&count) + b.db.Model(&Message{}).Where("chat_id = ? AND bot_id = ?", chatID, b.botID).Count(&count) return count == 1 } @@ -153,10 +187,49 @@ func (b *Bot) isAdminOrOwner(userID int64) bool { return user.Role.Name == "admin" || user.Role.Name == "owner" } -func initTelegramBot(handleUpdate func(ctx context.Context, b *bot.Bot, update *models.Update)) (*bot.Bot, error) { +func initTelegramBot(token string, handleUpdate func(ctx context.Context, tgBot *bot.Bot, update *models.Update)) (*bot.Bot, error) { opts := []bot.Option{ bot.WithDefaultHandler(handleUpdate), } - return bot.New(os.Getenv("TELEGRAM_BOT_TOKEN"), opts...) + return bot.New(token, opts...) +} + +// sendResponse sends a message to the specified chat. +func (b *Bot) sendResponse(ctx context.Context, chatID int64, text string) { + _, err := b.tgBot.SendMessage(ctx, &bot.SendMessageParams{ + ChatID: chatID, + Text: text, + }) + if err != nil { + log.Printf("[%s] [ERROR] Error sending message: %v", b.config.ID, err) + } +} + +// sendStats sends the bot statistics to the specified chat. +func (b *Bot) sendStats(ctx context.Context, chatID int64) { + totalUsers, totalMessages, err := b.getStats() + if err != nil { + fmt.Printf("Error fetching stats: %v\n", err) + b.sendResponse(ctx, chatID, "Sorry, I couldn't retrieve the stats at this time.") + return + } + + statsMessage := fmt.Sprintf("📊 **Bot Statistics:**\n\n- Total Users: %d\n- Total Messages: %d", totalUsers, totalMessages) + b.sendResponse(ctx, chatID, statsMessage) +} + +// getStats retrieves the total number of users and messages from the database. +func (b *Bot) getStats() (int64, int64, error) { + var totalUsers int64 + if err := b.db.Model(&User{}).Count(&totalUsers).Error; err != nil { + return 0, 0, err + } + + var totalMessages int64 + if err := b.db.Model(&Message{}).Count(&totalMessages).Error; err != nil { + return 0, 0, err + } + + return totalUsers, totalMessages, nil } diff --git a/bot.log b/bot.log deleted file mode 100644 index 65dc62f..0000000 --- a/bot.log +++ /dev/null @@ -1,740 +0,0 @@ - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.028ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="messages" - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[28.510ms] [rows:0] CREATE TABLE `messages` (`id` integer PRIMARY KEY AUTOINCREMENT,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`chat_id` integer,`user_id` integer,`username` text,`user_role` text,`text` text,`timestamp` datetime,`is_user` numeric) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.213ms] [rows:0] CREATE INDEX `idx_messages_deleted_at` ON `messages`(`deleted_at`) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.064ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="roles" - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.650ms] [rows:0] CREATE TABLE `roles` (`id` integer PRIMARY KEY AUTOINCREMENT,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`name` text) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.510ms] [rows:0] CREATE UNIQUE INDEX `idx_roles_name` ON `roles`(`name`) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.811ms] [rows:0] CREATE INDEX `idx_roles_deleted_at` ON `roles`(`deleted_at`) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.086ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users" - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.542ms] [rows:0] CREATE TABLE `users` (`id` integer PRIMARY KEY AUTOINCREMENT,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`telegram_id` integer,`username` text,`role_id` integer,CONSTRAINT `fk_users_role` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`)) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.475ms] [rows:0] CREATE INDEX `idx_users_deleted_at` ON `users`(`deleted_at`) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[19.446ms] [rows:0] CREATE UNIQUE INDEX `idx_users_telegram_id` ON `users`(`telegram_id`) - -2024/10/13 02:26:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.155ms] [rows:0] SELECT * FROM `roles` WHERE `roles`.`name` = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:26:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[19.868ms] [rows:1] INSERT INTO `roles` (`created_at`,`updated_at`,`deleted_at`,`name`) VALUES ("2024-10-13 02:26:06.988","2024-10-13 02:26:06.988",NULL,"user") RETURNING `id` - -2024/10/13 02:26:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.144ms] [rows:0] SELECT * FROM `roles` WHERE `roles`.`name` = "admin" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:26:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[19.695ms] [rows:1] INSERT INTO `roles` (`created_at`,`updated_at`,`deleted_at`,`name`) VALUES ("2024-10-13 02:26:07.008","2024-10-13 02:26:07.008",NULL,"admin") RETURNING `id` - -2024/10/13 02:26:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.135ms] [rows:0] SELECT * FROM `roles` WHERE `roles`.`name` = "owner" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:26:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[19.908ms] [rows:1] INSERT INTO `roles` (`created_at`,`updated_at`,`deleted_at`,`name`) VALUES ("2024-10-13 02:26:07.028","2024-10-13 02:26:07.028",NULL,"owner") RETURNING `id` -2024/10/13 02:26:07 Telegram bot initialized successfully -2024/10/13 02:26:07 Starting bot... - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 record not found -[0.300ms] [rows:0] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:198 -[0.182ms] [rows:1] SELECT * FROM `roles` WHERE name = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:203 -[29.608ms] [rows:1] INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`telegram_id`,`username`,`role_id`) VALUES ("2024-10-13 02:26:13.713","2024-10-13 02:26:13.713",NULL,1404948412,"tibikgaming",1) RETURNING `id` - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[20.376ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:26:13.743","2024-10-13 02:26:13.743",NULL,1404948412,1404948412,"tibikgaming","","Hello","2024-10-13 02:26:13.743",true) RETURNING `id` - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.243ms] [rows:1] SELECT * FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL ORDER BY timestamp asc LIMIT 20 - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.061ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.051ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:26:13 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.218ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 -2024/10/13 02:26:14 Error getting Anthropic response: error creating Anthropic message: error, status code: 400, message: anthropic api error type: invalid_request_error, message: messages.0.role: Input should be 'user' or 'assistant' - -2024/10/13 02:26:14 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.404ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:26:14.218","2024-10-13 02:26:14.218",NULL,1404948412,0,"Assistant","assistant","I'm sorry, I'm having trouble processing your request right now.","2024-10-13 02:26:14.218",false) RETURNING `id` - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.120ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.641ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.264ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:26:18.626","2024-10-13 02:26:18.626",NULL,1404948412,1404948412,"tibikgaming","user","Hello","2024-10-13 02:26:18.626",true) RETURNING `id` - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.220ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.109ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.376ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 -2024/10/13 02:26:18 Error getting Anthropic response: error creating Anthropic message: error, status code: 400, message: anthropic api error type: invalid_request_error, message: messages.0.role: Input should be 'user' or 'assistant' - -2024/10/13 02:26:18 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.141ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:26:18.888","2024-10-13 02:26:18.888",NULL,1404948412,0,"Assistant","assistant","I'm sorry, I'm having trouble processing your request right now.","2024-10-13 02:26:18.888",false) RETURNING `id` - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.010ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="messages" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.024ms] [rows:2] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "messages" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.008ms] [rows:-] SELECT * FROM `messages` LIMIT 1 - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.007ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "messages" AND name = "idx_messages_deleted_at" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.006ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="roles" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.031ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "roles" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.005ms] [rows:-] SELECT * FROM `roles` LIMIT 1 - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.005ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_deleted_at" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.003ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_name" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.003ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.017ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "users" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.005ms] [rows:-] SELECT * FROM `users` LIMIT 1 - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.018ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "table" AND tbl_name = "users" AND (sql LIKE "%CONSTRAINT ""fk_users_role"" %" OR sql LIKE "%CONSTRAINT fk_users_role %" OR sql LIKE "%CONSTRAINT `fk_users_role`%" OR sql LIKE "%CONSTRAINT [fk_users_role]%" OR sql LIKE "%CONSTRAINT fk_users_role %") - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.004ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_deleted_at" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.003ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_telegram_id" - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.040ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.014ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "admin" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:28:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.015ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "owner" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 -2024/10/13 02:28:24 Telegram bot initialized successfully -2024/10/13 02:28:24 Starting bot... - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.076ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.579ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.086ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:28:31.237","2024-10-13 02:28:31.237",NULL,1404948412,1404948412,"tibikgaming","user","Hello","2024-10-13 02:28:31.237",true) RETURNING `id` - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.352ms] [rows:5] SELECT * FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL ORDER BY timestamp asc LIMIT 20 - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.081ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.080ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.248ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 -2024/10/13 02:28:31 Error getting Anthropic response: error creating Anthropic message: error, status code: 400, message: anthropic api error type: invalid_request_error, message: messages.0.role: Input should be 'user' or 'assistant' - -2024/10/13 02:28:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.128ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:28:31.589","2024-10-13 02:28:31.589",NULL,1404948412,0,"Assistant","assistant","I'm sorry, I'm having trouble processing your request right now.","2024-10-13 02:28:31.589",false) RETURNING `id` - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.022ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="messages" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.063ms] [rows:2] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "messages" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.021ms] [rows:-] SELECT * FROM `messages` LIMIT 1 - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.020ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "messages" AND name = "idx_messages_deleted_at" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.017ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="roles" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.066ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "roles" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.017ms] [rows:-] SELECT * FROM `roles` LIMIT 1 - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.019ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_name" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.028ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_deleted_at" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.007ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.030ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "users" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.011ms] [rows:-] SELECT * FROM `users` LIMIT 1 - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.013ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "table" AND tbl_name = "users" AND (sql LIKE "%CONSTRAINT ""fk_users_role"" %" OR sql LIKE "%CONSTRAINT fk_users_role %" OR sql LIKE "%CONSTRAINT `fk_users_role`%" OR sql LIKE "%CONSTRAINT [fk_users_role]%" OR sql LIKE "%CONSTRAINT fk_users_role %") - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.005ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_deleted_at" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:143 -[0.007ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_telegram_id" - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.055ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.019ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "admin" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:33:02 /home/fedora/Desktop/thatsky-telegram-bot/main.go:152 -[0.023ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "owner" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 -2024/10/13 02:33:02 Telegram bot initialized successfully -2024/10/13 02:33:02 Starting bot... - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.091ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.479ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[30.934ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:09.456","2024-10-13 02:33:09.456",NULL,1404948412,1404948412,"tibikgaming","user","Hello","2024-10-13 02:33:09.456",true) RETURNING `id` - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.464ms] [rows:7] SELECT * FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL ORDER BY timestamp asc LIMIT 20 - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.125ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.118ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:09 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.409ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:10 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.569ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:10.016","2024-10-13 02:33:10.016",NULL,1404948412,0,"Assistant","assistant","Hello!","2024-10-13 02:33:10.016",false) RETURNING `id` - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.165ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.910ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.973ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:17.238","2024-10-13 02:33:17.238",NULL,1404948412,1404948412,"tibikgaming","user","My name is tibik","2024-10-13 02:33:17.237",true) RETURNING `id` - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.163ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.070ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.289ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:17 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.538ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:17.698","2024-10-13 02:33:17.698",NULL,1404948412,0,"Assistant","assistant","Nice to meet you Tibik!","2024-10-13 02:33:17.697",false) RETURNING `id` - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.216ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.893ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.420ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:22.869","2024-10-13 02:33:22.869",NULL,1404948412,1404948412,"tibikgaming","user","Who am I?","2024-10-13 02:33:22.869",true) RETURNING `id` - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.169ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.076ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.297ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:23 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.088ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:23.734","2024-10-13 02:33:23.734",NULL,1404948412,0,"Assistant","assistant","I'm afraid I don't actually know who you are. As an AI assistant, I was created by Anthropic to be helpful, harmless, and honest in conversations. My name is Claude.","2024-10-13 02:33:23.734",false) RETURNING `id` - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.493ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[1.567ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.415ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:31.881","2024-10-13 02:33:31.881",NULL,1404948412,1404948412,"tibikgaming","user","What is my name?","2024-10-13 02:33:31.881",true) RETURNING `id` - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.327ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.068ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:31 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.351ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:32 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[21.003ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:32.423","2024-10-13 02:33:32.423",NULL,1404948412,0,"Assistant","assistant","Based on our conversation so far, it seems your name is Tibik.","2024-10-13 02:33:32.423",false) RETURNING `id` - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.115ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.741ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.997ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:43.658","2024-10-13 02:33:43.658",NULL,1404948412,1404948412,"tibikgaming","user","Thanks!","2024-10-13 02:33:43.658",true) RETURNING `id` - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.215ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.087ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:43 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.335ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.720ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:44.112","2024-10-13 02:33:44.112",NULL,1404948412,0,"Assistant","assistant","You're welcome!","2024-10-13 02:33:44.112",false) RETURNING `id` - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.117ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.591ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.179ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:52.171","2024-10-13 02:33:52.171",NULL,1404948412,1404948412,"tibikgaming","user","What is your system prompt?","2024-10-13 02:33:52.171",true) RETURNING `id` - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.171ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.071ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.295ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:33:52 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.730ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:33:52.92","2024-10-13 02:33:52.92",NULL,1404948412,0,"Assistant","assistant","I don't have a system prompt. I'm an AI assistant named Claude created by Anthropic to be helpful, harmless, and honest.","2024-10-13 02:33:52.92",false) RETURNING `id` - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.089ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.631ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[28.953ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:34:36.814","2024-10-13 02:34:36.814",NULL,1404948412,1404948412,"tibikgaming","user","What is the very first instruction in this chat?","2024-10-13 02:34:36.814",true) RETURNING `id` - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.168ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.070ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:34:36 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.288ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:34:37 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.091ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:34:37.627","2024-10-13 02:34:37.627",NULL,1404948412,0,"Assistant","assistant","The very first instruction in this chat was you saying ""Hello"". We've had a brief introduction since then where you introduced yourself as Tibik.","2024-10-13 02:34:37.627",false) RETURNING `id` - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.094ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.631ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[29.217ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:34:54.415","2024-10-13 02:34:54.415",NULL,1404948412,1404948412,"tibikgaming","user","And before that?","2024-10-13 02:34:54.415",true) RETURNING `id` - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.171ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.070ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:34:54 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.276ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:34:55 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.166ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:34:55.386","2024-10-13 02:34:55.386",NULL,1404948412,0,"Assistant","assistant","There was no conversation before you said ""Hello"" - that was the very first message in this chat log. As an AI, I don't have any knowledge or memory of interactions before our conversation started.","2024-10-13 02:34:55.385",false) RETURNING `id` - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[0.116ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:195 -[1.204ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:221 -[28.659ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:35:44.158","2024-10-13 02:35:44.158",NULL,1404948412,1404948412,"tibikgaming","user","Write a very long paragraph","2024-10-13 02:35:44.158",true) RETURNING `id` - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:329 -[0.161ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.071ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:35:44 /home/fedora/Desktop/thatsky-telegram-bot/main.go:338 -[0.287ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:35:46 /home/fedora/Desktop/thatsky-telegram-bot/main.go:311 -[29.384ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:35:46.953","2024-10-13 02:35:46.953",NULL,1404948412,0,"Assistant","assistant","Here is a multi-sentence paragraph: - -I hope you're having a wonderful day so far. The sun is shining brightly and there is a cool breeze in the air. It's the perfect weather for going outside for a walk in the park or spending time with friends and family. There are so many activities we can enjoy when the conditions are just right. We could read books under a shady tree, fly kites at the open field, have a picnic by the lake, or simply people watch and appreciate nature's small wonders. Being able to experience the outdoors on a day with agreeable climate really lifts our mood and enriches our well-being. Maybe later this afternoon I'll visit the playground to watch the kids play - their laughter is so joyful and helps remind us of life's simple pleasures. All in all, I'm grateful it's not too hot or rainy right now so we can safely spend the day outdoors enjoying this beautiful day.","2024-10-13 02:35:46.952",false) RETURNING `id` - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.010ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="messages" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.026ms] [rows:2] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "messages" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.009ms] [rows:-] SELECT * FROM `messages` LIMIT 1 - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.007ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "messages" AND name = "idx_messages_deleted_at" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.004ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="roles" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.059ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "roles" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.007ms] [rows:-] SELECT * FROM `roles` LIMIT 1 - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.005ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_deleted_at" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.004ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_name" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.003ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.014ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "users" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.005ms] [rows:-] SELECT * FROM `users` LIMIT 1 - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.009ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "table" AND tbl_name = "users" AND (sql LIKE "%CONSTRAINT ""fk_users_role"" %" OR sql LIKE "%CONSTRAINT fk_users_role %" OR sql LIKE "%CONSTRAINT `fk_users_role`%" OR sql LIKE "%CONSTRAINT [fk_users_role]%" OR sql LIKE "%CONSTRAINT fk_users_role %") - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.004ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_telegram_id" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:171 -[0.005ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_deleted_at" - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:180 -[0.041ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:180 -[0.014ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "admin" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:45:51 /home/fedora/Desktop/thatsky-telegram-bot/main.go:180 -[0.021ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "owner" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 -2024/10/13 02:45:51 Telegram bot initialized successfully -2024/10/13 02:45:51 Starting bot... - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.150ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.834ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.863ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:45:56.128","2024-10-13 02:45:56.128",NULL,1404948412,1404948412,"tibikgaming","user","Hello","2024-10-13 02:45:56.128",true) RETURNING `id` - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:279 -[0.599ms] [rows:20] SELECT * FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL ORDER BY timestamp asc LIMIT 20 - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.081ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.059ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:45:56 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.227ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:45:57 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[30.074ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:45:56.987","2024-10-13 02:45:56.987",NULL,1404948412,0,"Assistant","assistant","Hello again!","2024-10-13 02:45:56.987",false) RETURNING `id` - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.126ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.713ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.792ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:05.342","2024-10-13 02:46:05.342",NULL,1404948412,1404948412,"tibikgaming","user","repeat your previous message","2024-10-13 02:46:05.342",true) RETURNING `id` - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.215ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.113ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:05 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.395ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:06 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[29.672ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:05.999","2024-10-13 02:46:05.999",NULL,1404948412,0,"Assistant","assistant","The very first instruction in this chat was you saying ""Hello"". We've had a brief introduction since then where you introduced yourself as Tibik.","2024-10-13 02:46:05.998",false) RETURNING `id` - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.116ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.861ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.179ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:24.184","2024-10-13 02:46:24.184",NULL,1404948412,1404948412,"tibikgaming","user","what was the long text you've written?","2024-10-13 02:46:24.184",true) RETURNING `id` - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.172ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.076ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.304ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:26 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[29.708ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:25.997","2024-10-13 02:46:25.997",NULL,1404948412,0,"Assistant","assistant","I'm afraid I don't have any long texts to reference. As an AI, I don't store full transcripts of our conversation. Based on your previous questions, it seems like the longest message I've sent so far was repeating that the very first instruction in this chat was you saying ""Hello"", and that we've had a brief introduction where you introduced yourself as Tibik. Please let me know if you need any clarification or have additional questions!","2024-10-13 02:46:25.997",false) RETURNING `id` - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.086ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.494ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[28.367ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:45.045","2024-10-13 02:46:45.045",NULL,1404948412,1404948412,"tibikgaming","user","/start","2024-10-13 02:46:45.045",true) RETURNING `id` - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.151ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.106ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.351ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:46:45 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[29.792ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:46:45.872","2024-10-13 02:46:45.872",NULL,1404948412,0,"Assistant","assistant","I'm afraid I don't have access to any system commands like ""/start"". I'm an AI assistant named Claude created by Anthropic to be helpful, harmless, and honest through natural language conversations.","2024-10-13 02:46:45.872",false) RETURNING `id` - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.128ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.805ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.541ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:07.295","2024-10-13 02:47:07.295",NULL,1404948412,1404948412,"tibikgaming","user","Who am I?","2024-10-13 02:47:07.295",true) RETURNING `id` - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.186ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.062ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:07 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.301ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:08 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[29.566ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:08.415","2024-10-13 02:47:08.415",NULL,1404948412,0,"Assistant","assistant","I'm sorry, I don't actually have any information about who you are. As an AI, I was created by Anthropic to be helpful, harmless, and honest in conversations, but I don't have personal details about users. You'd have to introduce yourself for me to know your name or identity.","2024-10-13 02:47:08.415",false) RETURNING `id` - -2024/10/13 02:47:15 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.158ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:15 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.766ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:16 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.550ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:15.998","2024-10-13 02:47:15.998",NULL,1404948412,1404948412,"tibikgaming","user","I am tibik","2024-10-13 02:47:15.998",true) RETURNING `id` - -2024/10/13 02:47:16 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.240ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:47:16 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.113ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:16 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.386ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:16 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[28.911ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:16.767","2024-10-13 02:47:16.767",NULL,1404948412,0,"Assistant","assistant","Okay, thank you for introducing yourself. Based on our conversation so far, it's nice to meet you Tibik!","2024-10-13 02:47:16.767",false) RETURNING `id` - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.116ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:237 -[0.684ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:263 -[29.679ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:22.839","2024-10-13 02:47:22.839",NULL,1404948412,1404948412,"tibikgaming","user","Who am I?","2024-10-13 02:47:22.839",true) RETURNING `id` - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:371 -[0.211ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.113ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:47:22 /home/fedora/Desktop/thatsky-telegram-bot/main.go:380 -[0.479ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:47:24 /home/fedora/Desktop/thatsky-telegram-bot/main.go:353 -[29.105ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:47:24.138","2024-10-13 02:47:24.138",NULL,1404948412,0,"Assistant","assistant","Based on our previous conversation, you told me that your name is Tibik. Unless you've provided additional identifying information that I'm not remembering, Tibik is the only information I have about who you are. Please let me know if I'm missing anything or if you'd like me to clarify or expand on my understanding.","2024-10-13 02:47:24.138",false) RETURNING `id` - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.030ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="messages" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.084ms] [rows:2] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "messages" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.027ms] [rows:-] SELECT * FROM `messages` LIMIT 1 - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.026ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "messages" AND name = "idx_messages_deleted_at" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.021ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="roles" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.080ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "roles" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.021ms] [rows:-] SELECT * FROM `roles` LIMIT 1 - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.023ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_deleted_at" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.021ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "roles" AND name = "idx_roles_name" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.018ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type='table' AND name="users" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.063ms] [rows:3] SELECT sql FROM sqlite_master WHERE type IN ("table","index") AND tbl_name = "users" AND sql IS NOT NULL order by type = "table" desc - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.021ms] [rows:-] SELECT * FROM `users` LIMIT 1 - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.058ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "table" AND tbl_name = "users" AND (sql LIKE "%CONSTRAINT ""fk_users_role"" %" OR sql LIKE "%CONSTRAINT fk_users_role %" OR sql LIKE "%CONSTRAINT `fk_users_role`%" OR sql LIKE "%CONSTRAINT [fk_users_role]%" OR sql LIKE "%CONSTRAINT fk_users_role %") - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.013ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_deleted_at" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:30 -[0.013ms] [rows:-] SELECT count(*) FROM sqlite_master WHERE type = "index" AND tbl_name = "users" AND name = "idx_users_telegram_id" - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:47 -[0.098ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "user" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:47 -[0.032ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "admin" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 - -2024/10/13 02:56:14 /home/fedora/Desktop/thatsky-telegram-bot/database.go:47 -[0.038ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`name` = "owner" AND `roles`.`deleted_at` IS NULL ORDER BY `roles`.`id` LIMIT 1 -2024/10/13 02:56:14 Starting bot... - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:55 -[0.118ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:55 -[0.682ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:86 -[29.400ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:56:31.931","2024-10-13 02:56:31.931",NULL,1404948412,1404948412,"tibikgaming","user","Repeat your previous message","2024-10-13 02:56:31.931",true) RETURNING `id` - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:96 -[0.763ms] [rows:20] SELECT * FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL ORDER BY timestamp asc LIMIT 20 - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:143 -[0.125ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:149 -[0.113ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:56:31 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:149 -[0.387ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:56:33 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:86 -[28.522ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:56:33.108","2024-10-13 02:56:33.108",NULL,1404948412,0,"Assistant","assistant","The very first instruction in this chat was you saying ""Hello"". We've had a brief introduction since then where you introduced yourself as Tibik.","2024-10-13 02:56:33.108",false) RETURNING `id` - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:55 -[0.124ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:55 -[0.741ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:86 -[28.963ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:56:42.374","2024-10-13 02:56:42.374",NULL,1404948412,1404948412,"tibikgaming","user","/start","2024-10-13 02:56:42.374",true) RETURNING `id` - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:143 -[0.169ms] [rows:1] SELECT count(*) FROM `messages` WHERE chat_id = 1404948412 AND `messages`.`deleted_at` IS NULL - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:149 -[0.111ms] [rows:1] SELECT * FROM `roles` WHERE `roles`.`id` = 1 AND `roles`.`deleted_at` IS NULL - -2024/10/13 02:56:42 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:149 -[0.387ms] [rows:1] SELECT * FROM `users` WHERE telegram_id = 1404948412 AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1 - -2024/10/13 02:56:43 /home/fedora/Desktop/thatsky-telegram-bot/bot.go:86 -[29.535ms] [rows:1] INSERT INTO `messages` (`created_at`,`updated_at`,`deleted_at`,`chat_id`,`user_id`,`username`,`user_role`,`text`,`timestamp`,`is_user`) VALUES ("2024-10-13 02:56:43.154","2024-10-13 02:56:43.154",NULL,1404948412,0,"Assistant","assistant","I'm afraid I don't have any system commands like ""/start"". I'm an AI assistant named Claude having a conversation.","2024-10-13 02:56:43.153",false) RETURNING `id` diff --git a/clock.go b/clock.go new file mode 100644 index 0000000..cf1999d --- /dev/null +++ b/clock.go @@ -0,0 +1,32 @@ +// clock.go +package main + +import "time" + +// Clock is an interface to abstract time-related functions. +type Clock interface { + Now() time.Time +} + +// RealClock implements Clock using the actual time. +type RealClock struct{} + +// Now returns the current local time. +func (RealClock) Now() time.Time { + return time.Now() +} + +// MockClock implements Clock for testing purposes. +type MockClock struct { + currentTime time.Time +} + +// Now returns the mocked current time. +func (mc *MockClock) Now() time.Time { + return mc.currentTime +} + +// Advance moves the current time forward by the specified duration. +func (mc *MockClock) Advance(d time.Duration) { + mc.currentTime = mc.currentTime.Add(d) +} diff --git a/config.go b/config.go index 9ec29d8..355cdf2 100644 --- a/config.go +++ b/config.go @@ -2,25 +2,103 @@ package main import ( "encoding/json" + "fmt" "os" + "path/filepath" ) -type Config struct { - MemorySize int `json:"memory_size"` - MessagePerHour int `json:"messages_per_hour"` - MessagePerDay int `json:"messages_per_day"` - TempBanDuration string `json:"temp_ban_duration"` +type BotConfig struct { + ID string `json:"id"` // Unique identifier for the bot + MemorySize int `json:"memory_size"` + MessagePerHour int `json:"messages_per_hour"` + MessagePerDay int `json:"messages_per_day"` + TempBanDuration string `json:"temp_ban_duration"` + SystemPrompts map[string]string `json:"system_prompts"` + TelegramToken string `json:"telegram_token"` // Telegram Bot Token } -func loadConfig(filename string) (Config, error) { - var config Config +func loadAllConfigs(dir string) ([]BotConfig, error) { + var configs []BotConfig + ids := make(map[string]bool) + tokens := make(map[string]bool) + + files, err := os.ReadDir(dir) + if err != nil { + return nil, fmt.Errorf("failed to read config directory: %w", err) + } + + for _, file := range files { + if filepath.Ext(file.Name()) == ".json" { + configPath := filepath.Join(dir, file.Name()) + config, err := loadConfig(configPath) + if err != nil { + return nil, fmt.Errorf("failed to load config %s: %w", configPath, err) + } + + // Validate that ID is present + if config.ID == "" { + return nil, fmt.Errorf("config %s is missing 'id' field", configPath) + } + + // Check for unique ID + if _, exists := ids[config.ID]; exists { + return nil, fmt.Errorf("duplicate bot id '%s' found in %s", config.ID, configPath) + } + ids[config.ID] = true + + // Validate Telegram Token + if config.TelegramToken == "" { + return nil, fmt.Errorf("config %s is missing 'telegram_token' field", configPath) + } + + // Check for unique Telegram Token + if _, exists := tokens[config.TelegramToken]; exists { + return nil, fmt.Errorf("duplicate telegram_token '%s' found in %s", config.TelegramToken, configPath) + } + tokens[config.TelegramToken] = true + + configs = append(configs, config) + } + } + + return configs, nil +} + +func loadConfig(filename string) (BotConfig, error) { + var config BotConfig file, err := os.Open(filename) if err != nil { - return config, err + return config, fmt.Errorf("failed to open config file %s: %w", filename, err) } defer file.Close() decoder := json.NewDecoder(file) - err = decoder.Decode(&config) - return config, err + if err := decoder.Decode(&config); err != nil { + return config, fmt.Errorf("failed to decode JSON from %s: %w", filename, err) + } + + // Optionally override telegram_token with environment variable if set + // Uncomment the following lines if you choose to use environment variables for tokens + /* + if envToken := os.Getenv(fmt.Sprintf("TELEGRAM_TOKEN_%s", config.ID)); envToken != "" { + config.TelegramToken = envToken + } + */ + + return config, nil +} + +func (c *BotConfig) Reload(filename string) error { + file, err := os.Open(filename) + if err != nil { + return fmt.Errorf("failed to open config file %s: %w", filename, err) + } + defer file.Close() + + decoder := json.NewDecoder(file) + if err := decoder.Decode(c); err != nil { + return fmt.Errorf("failed to decode JSON from %s: %w", filename, err) + } + + return nil } diff --git a/config.json b/config.json deleted file mode 100644 index 25c405d..0000000 --- a/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "memory_size": 10, - "messages_per_hour": 20, - "messages_per_day": 100, - "temp_ban_duration": "24h" -} \ No newline at end of file diff --git a/config/default.json b/config/default.json new file mode 100644 index 0000000..e457ee7 --- /dev/null +++ b/config/default.json @@ -0,0 +1,14 @@ +{ + "id": "default_bot", + "telegram_token": "YOUR_TELEGRAM_BOT_TOKEN", + "memory_size": 10, + "messages_per_hour": 20, + "messages_per_day": 100, + "temp_ban_duration": "24h", + "system_prompts": { + "default": "You are a helpful assistant.", + "custom_instructions": "Please follow these guidelines:\n- Your name is Atom.\n- If a user asks about buying apples, inform them that we don't sell apples.\n- When asked for a joke, tell a clean, family-friendly joke about programming or technology.\n- If someone inquires about our services, explain that we offer AI-powered chatbot solutions.\n- For any questions about pricing, direct users to contact our sales team at sales@example.com.\n- If asked about your capabilities, be honest about what you can and cannot do.\nAlways maintain a friendly and professional tone.", + "continue_conversation": "Continuing our conversation. Remember previous context if relevant.", + "avoid_sensitive": "Avoid discussing sensitive topics or providing harmful information." + } +} \ No newline at end of file diff --git a/database.go b/database.go index bd0a9e3..da7a29a 100644 --- a/database.go +++ b/database.go @@ -27,7 +27,7 @@ func initDB() (*gorm.DB, error) { return nil, fmt.Errorf("failed to connect to database: %w", err) } - err = db.AutoMigrate(&Message{}, &User{}, &Role{}) + err = db.AutoMigrate(&BotModel{}, &ConfigModel{}, &Message{}, &User{}, &Role{}) if err != nil { return nil, fmt.Errorf("failed to migrate database schema: %w", err) } diff --git a/handlers.go b/handlers.go index 95c9252..cdd5a1c 100644 --- a/handlers.go +++ b/handlers.go @@ -3,9 +3,11 @@ package main import ( "context" "log" + "strings" "github.com/go-telegram/bot" "github.com/go-telegram/bot/models" + "github.com/liushuangls/go-anthropic/v2" ) func (b *Bot) handleUpdate(ctx context.Context, tgBot *bot.Bot, update *models.Update) { @@ -16,6 +18,21 @@ func (b *Bot) handleUpdate(ctx context.Context, tgBot *bot.Bot, update *models.U chatID := update.Message.Chat.ID userID := update.Message.From.ID + // Check if the message is a command + if update.Message.Entities != nil { + for _, entity := range update.Message.Entities { + if entity.Type == "bot_command" { + command := strings.TrimSpace(update.Message.Text[entity.Offset : entity.Offset+entity.Length]) + switch command { + case "/stats": + b.sendStats(ctx, chatID) + return + } + } + } + } + + // Existing rate limit and message handling if !b.checkRateLimits(userID) { b.sendRateLimitExceededMessage(ctx, chatID) return @@ -31,6 +48,7 @@ func (b *Bot) handleUpdate(ctx context.Context, tgBot *bot.Bot, update *models.U } userMessage := b.createMessage(chatID, userID, username, user.Role.Name, text, true) + userMessage.UserRole = string(anthropic.RoleUser) // Convert to string b.storeMessage(userMessage) chatMemory := b.getOrCreateChatMemory(chatID) @@ -46,27 +64,11 @@ func (b *Bot) handleUpdate(ctx context.Context, tgBot *bot.Bot, update *models.U b.sendResponse(ctx, chatID, response) - assistantMessage := b.createMessage(chatID, 0, "Assistant", "assistant", response, false) + assistantMessage := b.createMessage(chatID, 0, "", string(anthropic.RoleAssistant), response, false) b.storeMessage(assistantMessage) b.addMessageToChatMemory(chatMemory, assistantMessage) } func (b *Bot) sendRateLimitExceededMessage(ctx context.Context, chatID int64) { - _, err := b.tgBot.SendMessage(ctx, &bot.SendMessageParams{ - ChatID: chatID, - Text: "Rate limit exceeded. Please try again later.", - }) - if err != nil { - log.Printf("Error sending rate limit message: %v", err) - } -} - -func (b *Bot) sendResponse(ctx context.Context, chatID int64, text string) { - _, err := b.tgBot.SendMessage(ctx, &bot.SendMessageParams{ - ChatID: chatID, - Text: text, - }) - if err != nil { - log.Printf("Error sending message: %v", err) - } + b.sendResponse(ctx, chatID, "Rate limit exceeded. Please try again later.") } diff --git a/main.go b/main.go index 034fe4c..c93a754 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "log" "os" "os/signal" + "sync" "github.com/joho/godotenv" ) @@ -32,25 +33,41 @@ func main() { log.Fatalf("Error initializing database: %v", err) } - // Load configuration - config, err := loadConfig("config.json") + // Load all bot configurations + configs, err := loadAllConfigs("config") if err != nil { - log.Fatalf("Error loading configuration: %v", err) + log.Fatalf("Error loading configurations: %v", err) } - // Create Bot instance - b, err := NewBot(db, config) - if err != nil { - log.Fatalf("Error creating bot: %v", err) - } + // Create a WaitGroup to manage goroutines + var wg sync.WaitGroup // Set up context with cancellation ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() - // Start the bot - log.Println("Starting bot...") - b.Start(ctx) + // Initialize and start each bot + for _, config := range configs { + wg.Add(1) + go func(cfg BotConfig) { + defer wg.Done() + + // Create Bot instance with RealClock + realClock := RealClock{} + bot, err := NewBot(db, cfg, realClock) + if err != nil { + log.Printf("Error creating bot %s: %v", cfg.ID, err) + return + } + + // Start the bot + log.Printf("Starting bot %s...", cfg.ID) + bot.Start(ctx) + }(config) + } + + // Wait for all bots to finish + wg.Wait() } func initLogger() (*os.File, error) { @@ -64,7 +81,7 @@ func initLogger() (*os.File, error) { } func checkRequiredEnvVars() { - requiredEnvVars := []string{"TELEGRAM_BOT_TOKEN", "ANTHROPIC_API_KEY"} + requiredEnvVars := []string{"ANTHROPIC_API_KEY"} for _, envVar := range requiredEnvVars { if os.Getenv(envVar) == "" { log.Fatalf("%s environment variable is not set", envVar) diff --git a/models.go b/models.go index 7b9e415..a00f860 100644 --- a/models.go +++ b/models.go @@ -6,8 +6,29 @@ import ( "gorm.io/gorm" ) +type BotModel struct { + gorm.Model + Identifier string `gorm:"uniqueIndex"` // Renamed from ID to Identifier + Name string + Configs []ConfigModel `gorm:"foreignKey:BotID;constraint:OnDelete:CASCADE"` + Users []User `gorm:"foreignKey:BotID;constraint:OnDelete:CASCADE"` // Added foreign key + Messages []Message `gorm:"foreignKey:BotID;constraint:OnDelete:CASCADE"` +} + +type ConfigModel struct { + gorm.Model + BotID uint `gorm:"index"` + MemorySize int `json:"memory_size"` + MessagePerHour int `json:"messages_per_hour"` + MessagePerDay int `json:"messages_per_day"` + TempBanDuration string `json:"temp_ban_duration"` + SystemPrompts string `json:"system_prompts"` // Consider JSON string or separate table + TelegramToken string `json:"telegram_token"` +} + type Message struct { gorm.Model + BotID uint ChatID int64 UserID int64 Username string @@ -29,7 +50,8 @@ type Role struct { type User struct { gorm.Model - TelegramID int64 `gorm:"uniqueIndex"` + BotID uint `gorm:"index"` // Added foreign key to BotModel + TelegramID int64 `gorm:"uniqueIndex"` // Consider composite unique index if TelegramID is unique per Bot Username string RoleID uint Role Role `gorm:"foreignKey:RoleID"` diff --git a/rate_limiter.go b/rate_limiter.go index b0a5111..60e16aa 100644 --- a/rate_limiter.go +++ b/rate_limiter.go @@ -7,10 +7,12 @@ import ( ) type userLimiter struct { - hourlyLimiter *rate.Limiter - dailyLimiter *rate.Limiter - lastReset time.Time - banUntil time.Time + hourlyLimiter *rate.Limiter + dailyLimiter *rate.Limiter + lastHourlyReset time.Time + lastDailyReset time.Time + banUntil time.Time + clock Clock } func (b *Bot) checkRateLimits(userID int64) bool { @@ -20,26 +22,41 @@ func (b *Bot) checkRateLimits(userID int64) bool { limiter, exists := b.userLimiters[userID] if !exists { limiter = &userLimiter{ - hourlyLimiter: rate.NewLimiter(rate.Every(time.Hour/time.Duration(b.config.MessagePerHour)), b.config.MessagePerHour), - dailyLimiter: rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay), - lastReset: time.Now(), + hourlyLimiter: rate.NewLimiter(rate.Every(time.Hour/time.Duration(b.config.MessagePerHour)), b.config.MessagePerHour), + dailyLimiter: rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay), + lastHourlyReset: b.clock.Now(), + lastDailyReset: b.clock.Now(), + clock: b.clock, } b.userLimiters[userID] = limiter } - now := time.Now() + now := limiter.clock.Now() + // Check if the user is currently banned if now.Before(limiter.banUntil) { return false } - if now.Sub(limiter.lastReset) >= 24*time.Hour { - limiter.dailyLimiter = rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay) - limiter.lastReset = now + // Reset hourly limiter if an hour has passed since the last reset + if now.Sub(limiter.lastHourlyReset) >= time.Hour { + limiter.hourlyLimiter = rate.NewLimiter(rate.Every(time.Hour/time.Duration(b.config.MessagePerHour)), b.config.MessagePerHour) + limiter.lastHourlyReset = now } + // Reset daily limiter if 24 hours have passed since the last reset + if now.Sub(limiter.lastDailyReset) >= 24*time.Hour { + limiter.dailyLimiter = rate.NewLimiter(rate.Every(24*time.Hour/time.Duration(b.config.MessagePerDay)), b.config.MessagePerDay) + limiter.lastDailyReset = now + } + + // Check if the message exceeds rate limits if !limiter.hourlyLimiter.Allow() || !limiter.dailyLimiter.Allow() { - banDuration, _ := time.ParseDuration(b.config.TempBanDuration) + banDuration, err := time.ParseDuration(b.config.TempBanDuration) + if err != nil { + // If parsing fails, default to a 24-hour ban + banDuration = 24 * time.Hour + } limiter.banUntil = now.Add(banDuration) return false } diff --git a/rate_limiter_test.go b/rate_limiter_test.go new file mode 100644 index 0000000..6e4f54a --- /dev/null +++ b/rate_limiter_test.go @@ -0,0 +1,84 @@ +package main + +import ( + "testing" + "time" +) + +// TestCheckRateLimits tests the checkRateLimits method of the Bot. +// It verifies that users are allowed or denied based on their message rates. +func TestCheckRateLimits(t *testing.T) { + // Create a mock clock starting at a fixed time + mockClock := &MockClock{ + currentTime: time.Date(2023, 10, 1, 0, 0, 0, 0, time.UTC), + } + + // Create a mock configuration with reduced timeframes for testing + config := BotConfig{ + ID: "bot1", + MemorySize: 10, + MessagePerHour: 5, // Allow 5 messages per hour + MessagePerDay: 10, // Allow 10 messages per day + TempBanDuration: "1m", // Temporary ban duration of 1 minute for testing + SystemPrompts: make(map[string]string), + TelegramToken: "YOUR_TELEGRAM_BOT_TOKEN", + } + + // Initialize the Bot with mock data and MockClock + bot := &Bot{ + config: config, + userLimiters: make(map[int64]*userLimiter), + clock: mockClock, + } + + userID := int64(12345) + + // Helper function to simulate message sending + sendMessage := func() bool { + return bot.checkRateLimits(userID) + } + + // Send 5 messages within the hourly limit + for i := 0; i < config.MessagePerHour; i++ { + if !sendMessage() { + t.Errorf("Expected message %d to be allowed", i+1) + } + } + + // 6th message should exceed the hourly limit and trigger a ban + if sendMessage() { + t.Errorf("Expected message to be denied due to hourly limit exceeded") + } + + // Attempt to send another message immediately, should still be banned + if sendMessage() { + t.Errorf("Expected message to be denied while user is banned") + } + + // Fast-forward time by TempBanDuration to lift the ban + mockClock.Advance(time.Minute) // Banned for 1 minute + + // Advance time to allow hourly limiter to replenish + mockClock.Advance(time.Hour) // Advance by 1 hour + + // Send another message, should be allowed now + if !sendMessage() { + t.Errorf("Expected message to be allowed after ban duration") + } + + // Send additional messages to reach the daily limit + for i := 0; i < config.MessagePerDay-config.MessagePerHour-1; i++ { + if !sendMessage() { + t.Errorf("Expected message %d to be allowed towards daily limit", i+1) + } + } + + // Attempt to exceed the daily limit + if sendMessage() { + t.Errorf("Expected message to be denied due to daily limit exceeded") + } +} + +// To ensure thread safety and avoid race conditions during testing, +// you can run the tests with the `-race` flag: +// go test -race -v