Dev branch beginning with a bunch of shit added. All I know is that it builds.
This commit is contained in:
@ -77,11 +77,14 @@ func (b *Bot) Run() error {
|
||||
|
||||
func (b *Bot) handleEvents(client *socketmode.Client) {
|
||||
for evt := range client.Events {
|
||||
log.Printf("DEBUG: Received event type: %s", evt.Type)
|
||||
switch evt.Type {
|
||||
case socketmode.EventTypeEventsAPI:
|
||||
b.handleEventsAPI(client, evt)
|
||||
case socketmode.EventTypeSlashCommand:
|
||||
b.handleSlashCommand(client, evt)
|
||||
default:
|
||||
log.Printf("DEBUG: Unhandled event type: %s", evt.Type)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -89,16 +92,21 @@ func (b *Bot) handleEvents(client *socketmode.Client) {
|
||||
func (b *Bot) handleEventsAPI(client *socketmode.Client, evt socketmode.Event) {
|
||||
eventsAPIEvent, ok := evt.Data.(slackevents.EventsAPIEvent)
|
||||
if !ok {
|
||||
log.Printf("Ignored %+v\n", evt)
|
||||
log.Printf("DEBUG: Could not cast to EventsAPIEvent: %+v\n", evt)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("DEBUG: EventsAPI type: %s", eventsAPIEvent.Type)
|
||||
|
||||
client.Ack(*evt.Request)
|
||||
|
||||
if eventsAPIEvent.Type == slackevents.CallbackEvent {
|
||||
innerEvent := eventsAPIEvent.InnerEvent
|
||||
log.Printf("DEBUG: InnerEvent type: %s", innerEvent.Type)
|
||||
if msgEvent, ok := innerEvent.Data.(*slackevents.MessageEvent); ok {
|
||||
b.handleMessage(msgEvent)
|
||||
} else {
|
||||
log.Printf("DEBUG: InnerEvent was not a MessageEvent: %T", innerEvent.Data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -115,6 +123,37 @@ func (b *Bot) handleMessage(ev *slackevents.MessageEvent) {
|
||||
return
|
||||
}
|
||||
|
||||
// Convert timestamp
|
||||
tsFloat, _ := strconv.ParseFloat(ev.TimeStamp, 64)
|
||||
timestamp := time.Unix(int64(tsFloat), 0)
|
||||
|
||||
// Validate puzzle number (allow ±1 day for timezones)
|
||||
if !wordlepattern.IsValidPuzzleNumber(match.PuzzleNumber, timestamp) {
|
||||
log.Printf("Invalid puzzle number %d for date %s (expected ~%d)",
|
||||
match.PuzzleNumber,
|
||||
timestamp.Format("2006-01-02"),
|
||||
wordlepattern.GetExpectedPuzzleNumber(timestamp))
|
||||
|
||||
// React with ❌ to indicate invalid score
|
||||
b.client.AddReaction("x", slack.ItemRef{
|
||||
Channel: ev.Channel,
|
||||
Timestamp: ev.TimeStamp,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// Check if user already posted today
|
||||
if b.tracker.HasPostedToday(ev.User) {
|
||||
log.Printf("User %s already posted a score today, ignoring duplicate", ev.User)
|
||||
|
||||
// React with 🔁 to indicate duplicate
|
||||
b.client.AddReaction("repeat", slack.ItemRef{
|
||||
Channel: ev.Channel,
|
||||
Timestamp: ev.TimeStamp,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// Get user info
|
||||
user, err := b.client.GetUserInfo(ev.User)
|
||||
if err != nil {
|
||||
@ -127,10 +166,6 @@ func (b *Bot) handleMessage(ev *slackevents.MessageEvent) {
|
||||
userName = user.Name
|
||||
}
|
||||
|
||||
// Convert timestamp
|
||||
tsFloat, _ := strconv.ParseFloat(ev.TimeStamp, 64)
|
||||
timestamp := time.Unix(int64(tsFloat), 0)
|
||||
|
||||
// Track the score
|
||||
if err := b.tracker.Add(ev.User, userName, match.PuzzleNumber, match.Score, timestamp); err != nil {
|
||||
log.Printf("Error tracking score: %v", err)
|
||||
@ -139,12 +174,35 @@ func (b *Bot) handleMessage(ev *slackevents.MessageEvent) {
|
||||
|
||||
log.Printf("Tracked score for %s: Wordle %d %s/6", userName, match.PuzzleNumber, match.Score)
|
||||
|
||||
// React to the message
|
||||
if err := b.client.AddReaction("white_check_mark", slack.ItemRef{
|
||||
Channel: ev.Channel,
|
||||
Timestamp: ev.TimeStamp,
|
||||
}); err != nil {
|
||||
log.Printf("Error adding reaction: %v", err)
|
||||
// Get updated today's scores
|
||||
todayScores := b.tracker.GetToday()
|
||||
|
||||
// Update with current usernames
|
||||
tracker.UpdateDailyScoresNames(todayScores, func(userID string) string {
|
||||
u, err := b.client.GetUserInfo(userID)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
if u.RealName != "" {
|
||||
return u.RealName
|
||||
}
|
||||
return u.Name
|
||||
})
|
||||
|
||||
// Format a nice response
|
||||
var response strings.Builder
|
||||
response.WriteString(fmt.Sprintf("✅ Score recorded for *%s*: %s/6\n\n", userName, match.Score))
|
||||
response.WriteString(tracker.FormatToday(todayScores))
|
||||
|
||||
// Reply in thread
|
||||
_, _, err = b.client.PostMessage(
|
||||
ev.Channel,
|
||||
slack.MsgOptionText(response.String(), false),
|
||||
slack.MsgOptionTS(ev.TimeStamp), // Reply in thread
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Error posting thread reply: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,17 +290,61 @@ Summary Channel: %s`, cfg.SummaryTime, channelText), nil
|
||||
func (b *Bot) handleStatsCommand(cmd slack.SlashCommand) (string, error) {
|
||||
args := strings.TrimSpace(cmd.Text)
|
||||
|
||||
// Helper function to get current username
|
||||
getCurrentName := func(userID string) string {
|
||||
user, err := b.client.GetUserInfo(userID)
|
||||
if err != nil {
|
||||
return "" // Keep stored name
|
||||
}
|
||||
if user.RealName != "" {
|
||||
return user.RealName
|
||||
}
|
||||
return user.Name
|
||||
}
|
||||
|
||||
switch args {
|
||||
case "", "yesterday":
|
||||
scores := b.tracker.GetYesterday()
|
||||
tracker.UpdateDailyScoresNames(scores, getCurrentName)
|
||||
return tracker.FormatSummary(scores), nil
|
||||
|
||||
case "today":
|
||||
scores := b.tracker.GetToday()
|
||||
tracker.UpdateDailyScoresNames(scores, getCurrentName)
|
||||
return tracker.FormatToday(scores), nil
|
||||
|
||||
case "week":
|
||||
weekScores := b.tracker.GetWeek()
|
||||
// Update names for each day
|
||||
for _, dailyScores := range weekScores {
|
||||
tracker.UpdateDailyScoresNames(dailyScores, getCurrentName)
|
||||
}
|
||||
return tracker.FormatWeek(weekScores), nil
|
||||
|
||||
case "leaderboard", "lb":
|
||||
entries := b.tracker.GetLeaderboard()
|
||||
tracker.UpdateLeaderboardNames(entries, getCurrentName)
|
||||
return tracker.FormatLeaderboard(entries, 10), nil
|
||||
|
||||
case "me", "my", "mystats":
|
||||
stats := b.tracker.GetUserStats(cmd.UserID)
|
||||
groupStreak := b.tracker.GetGroupStreak()
|
||||
|
||||
// Get current user name
|
||||
stats.UserName = getCurrentName(cmd.UserID)
|
||||
if stats.UserName == "" {
|
||||
stats.UserName = "You"
|
||||
}
|
||||
|
||||
return tracker.FormatUserStats(stats, groupStreak), nil
|
||||
|
||||
default:
|
||||
return "Usage: `/wordle-stats` or `/wordle-stats yesterday` or `/wordle-stats today`", nil
|
||||
return `Usage:
|
||||
` + "`/wordle-stats`" + ` or ` + "`/wordle-stats yesterday`" + ` - Yesterday's results
|
||||
` + "`/wordle-stats today`" + ` - Today's scores so far
|
||||
` + "`/wordle-stats week`" + ` - Last 7 days summary
|
||||
` + "`/wordle-stats leaderboard`" + ` - All-time leaderboard
|
||||
` + "`/wordle-stats me`" + ` - Your personal statistics`, nil
|
||||
}
|
||||
}
|
||||
|
||||
@ -287,6 +389,19 @@ func (b *Bot) postDailySummary() {
|
||||
}
|
||||
|
||||
yesterdayScores := b.tracker.GetYesterday()
|
||||
|
||||
// Update with current usernames
|
||||
tracker.UpdateDailyScoresNames(yesterdayScores, func(userID string) string {
|
||||
user, err := b.client.GetUserInfo(userID)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
if user.RealName != "" {
|
||||
return user.RealName
|
||||
}
|
||||
return user.Name
|
||||
})
|
||||
|
||||
summary := tracker.FormatSummary(yesterdayScores)
|
||||
|
||||
_, _, err := b.client.PostMessage(
|
||||
|
||||
Reference in New Issue
Block a user