package bot import ( "context" "fmt" "strings" "github.com/bwmarrin/discordgo" ) func (b *Bot) handleKudos(ctx context.Context, s *discordgo.Session, i *discordgo.InteractionCreate) { target := i.ApplicationCommandData().Options[0].UserValue(s) if target.ID == i.Member.User.ID { respondEphemeral(s, i, "You can't kudos yourself! 😄") return } fromName := displayName(i.Member, i.Member.User) targetMember, _ := s.GuildMember(i.GuildID, target.ID) toName := displayName(targetMember, target) if err := b.db.GiveKudos(ctx, i.GuildID, i.Member.User.ID, fromName, target.ID, toName); err != nil { respondEphemeral(s, i, "Error giving kudos.") return } total, _ := b.db.GetKudosReceived(ctx, i.GuildID, target.ID) respond(s, i, fmt.Sprintf("👏 **%s** gave kudos to **%s**! They've received %d kudos total. Keep riding! 🚴", fromName, toName, total)) } func (b *Bot) handleCompare(ctx context.Context, s *discordgo.Session, i *discordgo.InteractionCreate) { target := i.ApplicationCommandData().Options[0].UserValue(s) meID := i.Member.User.ID meName := displayName(i.Member, i.Member.User) targetMember, _ := s.GuildMember(i.GuildID, target.ID) themName := displayName(targetMember, target) since := b.challengeStart(ctx, i.GuildID) meStats, _ := b.db.GetUserStats(ctx, i.GuildID, meID, since) themStats, _ := b.db.GetUserStats(ctx, i.GuildID, target.ID, since) mePB, _ := b.db.GetUserPB(ctx, i.GuildID, meID) themPB, _ := b.db.GetUserPB(ctx, i.GuildID, target.ID) meStreak, _ := b.db.GetUserStreak(ctx, meID) themStreak, _ := b.db.GetUserStreak(ctx, target.ID) cmp := func(a, b float64) string { switch { case a > b: return "⬆️" case b > a: return "⬇️" default: return "=" } } cmpI := func(a, b int) string { return cmp(float64(a), float64(b)) } var sb strings.Builder sb.WriteString(fmt.Sprintf("## ⚔️ %s vs %s\n\n", meName, themName)) sb.WriteString(fmt.Sprintf("| | **%s** | **%s** |\n", meName, themName)) sb.WriteString("|---|---|---|\n") sb.WriteString(fmt.Sprintf("| Total KM %s | %.1f | %.1f |\n", cmp(meStats.TotalKM, themStats.TotalKM), meStats.TotalKM, themStats.TotalKM)) sb.WriteString(fmt.Sprintf("| Rides %s | %d | %d |\n", cmpI(meStats.LogCount, themStats.LogCount), meStats.LogCount, themStats.LogCount)) sb.WriteString(fmt.Sprintf("| Best ride %s | %.1f km | %.1f km |\n", cmp(mePB, themPB), mePB, themPB)) sb.WriteString(fmt.Sprintf("| Streak %s | %d days | %d days |\n", cmpI(meStreak, themStreak), meStreak, themStreak)) respondEphemeral(s, i, sb.String()) }