Update all Go modules in backend/ and backend/_example/memory_store/ to their latest versions (chroma 2.27, go-redis 9.21, bbolt 1.5, slack 0.27, golang.org/x/* and others); re-tidy and re-vendor, keep the example module in sync. Hold github.com/go-chi/chi/v5 at v5.2.5: v5.3.0 deprecates middleware.RealIP (IP-spoofing advisories). Switching off RealIP changes how the client IP is derived for rate limiting and votes, which is a security decision better made on its own rather than inside a dependency bump. go test -race, go vet, golangci-lint and govulncheck all clean on both modules.
280 lines
9.8 KiB
Go
280 lines
9.8 KiB
Go
package slack
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
// AckMessage is used for messages received in reply to other messages
|
|
type AckMessage struct {
|
|
ReplyTo int `json:"reply_to"`
|
|
Timestamp string `json:"ts"`
|
|
Text string `json:"text"`
|
|
RTMResponse
|
|
}
|
|
|
|
// RTMResponse encapsulates response details as returned by the Slack API
|
|
type RTMResponse struct {
|
|
Ok bool `json:"ok"`
|
|
Error *RTMError `json:"error"`
|
|
}
|
|
|
|
// RTMError encapsulates error information as returned by the Slack API
|
|
type RTMError struct {
|
|
Code int
|
|
Msg string
|
|
}
|
|
|
|
func (s RTMError) Error() string {
|
|
return fmt.Sprintf("Code %d - %s", s.Code, s.Msg)
|
|
}
|
|
|
|
// MessageEvent represents a Slack Message (used as the event type for an incoming message)
|
|
type MessageEvent Message
|
|
|
|
// RTMEvent is the main wrapper. You will find all the other messages attached
|
|
type RTMEvent struct {
|
|
Type string
|
|
Data any
|
|
}
|
|
|
|
// HelloEvent represents the hello event
|
|
type HelloEvent struct{}
|
|
|
|
// PresenceChangeEvent represents the presence change event
|
|
type PresenceChangeEvent struct {
|
|
Type string `json:"type"`
|
|
Presence string `json:"presence"`
|
|
User string `json:"user"`
|
|
Users []string `json:"users"`
|
|
}
|
|
|
|
// UserTypingEvent represents the user typing event
|
|
type UserTypingEvent struct {
|
|
Type string `json:"type"`
|
|
User string `json:"user"`
|
|
Channel string `json:"channel"`
|
|
}
|
|
|
|
// PrefChangeEvent represents a user preferences change event
|
|
type PrefChangeEvent struct {
|
|
Type string `json:"type"`
|
|
Name string `json:"name"`
|
|
Value json.RawMessage `json:"value"`
|
|
}
|
|
|
|
// ManualPresenceChangeEvent represents the manual presence change event
|
|
type ManualPresenceChangeEvent struct {
|
|
Type string `json:"type"`
|
|
Presence string `json:"presence"`
|
|
}
|
|
|
|
// UserChangeEvent represents the user change event
|
|
type UserChangeEvent struct {
|
|
Type string `json:"type"`
|
|
User User `json:"user"`
|
|
CacheTS int64 `json:"cache_ts"`
|
|
EventTS string `json:"event_ts"`
|
|
}
|
|
|
|
// UserStatusChangedEvent represents the user status changed event
|
|
type UserStatusChangedEvent struct {
|
|
Type string `json:"type"`
|
|
User User `json:"user"`
|
|
CacheTS int64 `json:"cache_ts"`
|
|
EventTS string `json:"event_ts"`
|
|
}
|
|
|
|
// UserHuddleChangedEvent represents the user huddle changed event
|
|
type UserHuddleChangedEvent struct {
|
|
Type string `json:"type"`
|
|
User User `json:"user"`
|
|
CacheTS int64 `json:"cache_ts"`
|
|
EventTS string `json:"event_ts"`
|
|
}
|
|
|
|
// UserProfileChangedEvent represents the user profile changed event
|
|
type UserProfileChangedEvent struct {
|
|
Type string `json:"type"`
|
|
User User `json:"user"`
|
|
CacheTS int64 `json:"cache_ts"`
|
|
EventTS string `json:"event_ts"`
|
|
}
|
|
|
|
// EmojiChangedEvent represents the emoji changed event
|
|
type EmojiChangedEvent struct {
|
|
Type string `json:"type"`
|
|
SubType string `json:"subtype"`
|
|
Name string `json:"name"`
|
|
Names []string `json:"names"`
|
|
Value string `json:"value"`
|
|
EventTimestamp string `json:"event_ts"`
|
|
}
|
|
|
|
// CommandsChangedEvent represents the commands changed event
|
|
type CommandsChangedEvent struct {
|
|
Type string `json:"type"`
|
|
EventTimestamp string `json:"event_ts"`
|
|
}
|
|
|
|
// EmailDomainChangedEvent represents the email domain changed event
|
|
type EmailDomainChangedEvent struct {
|
|
Type string `json:"type"`
|
|
EventTimestamp string `json:"event_ts"`
|
|
EmailDomain string `json:"email_domain"`
|
|
}
|
|
|
|
// BotAddedEvent represents the bot added event
|
|
type BotAddedEvent struct {
|
|
Type string `json:"type"`
|
|
Bot Bot `json:"bot"`
|
|
}
|
|
|
|
// BotChangedEvent represents the bot changed event
|
|
type BotChangedEvent struct {
|
|
Type string `json:"type"`
|
|
Bot Bot `json:"bot"`
|
|
}
|
|
|
|
// AccountsChangedEvent represents the accounts changed event
|
|
type AccountsChangedEvent struct {
|
|
Type string `json:"type"`
|
|
}
|
|
|
|
// ReconnectUrlEvent represents the receiving reconnect url event
|
|
type ReconnectUrlEvent struct {
|
|
Type string `json:"type"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
// MemberJoinedChannelEvent, a user joined a public or private channel
|
|
type MemberJoinedChannelEvent struct {
|
|
Type string `json:"type"`
|
|
User string `json:"user"`
|
|
Channel string `json:"channel"`
|
|
ChannelType string `json:"channel_type"`
|
|
Team string `json:"team"`
|
|
Inviter string `json:"inviter"`
|
|
}
|
|
|
|
// MemberLeftChannelEvent a user left a public or private channel
|
|
type MemberLeftChannelEvent struct {
|
|
Type string `json:"type"`
|
|
User string `json:"user"`
|
|
Channel string `json:"channel"`
|
|
ChannelType string `json:"channel_type"`
|
|
Team string `json:"team"`
|
|
}
|
|
|
|
// ChannelUpdatedEvent is fired when a channel's properties are updated (tabs, meeting
|
|
// notes, etc.).
|
|
type ChannelUpdatedEvent struct {
|
|
Type string `json:"type"`
|
|
Updates map[string]any `json:"updates"`
|
|
Channel string `json:"channel"`
|
|
Channels []string `json:"channels"`
|
|
EventTS string `json:"event_ts"`
|
|
TS string `json:"ts"`
|
|
}
|
|
|
|
// SHRoomRecording holds recording metadata for a Slack Call/Huddle room.
|
|
type SHRoomRecording struct {
|
|
CanRecordSummary string `json:"can_record_summary,omitempty"`
|
|
}
|
|
|
|
// SHRoom represents a Slack Huddle/Call room.
|
|
type SHRoom struct {
|
|
ID string `json:"id"`
|
|
Name *string `json:"name"` // nullable in Slack's response
|
|
MediaServer string `json:"media_server"`
|
|
CreatedBy string `json:"created_by"`
|
|
DateStart int64 `json:"date_start"`
|
|
DateEnd int64 `json:"date_end"`
|
|
Participants []string `json:"participants"`
|
|
ParticipantHistory []string `json:"participant_history"`
|
|
ParticipantsEvents map[string]map[string]any `json:"participants_events,omitempty"`
|
|
ParticipantsCameraOn []string `json:"participants_camera_on"`
|
|
ParticipantsCameraOff []string `json:"participants_camera_off"`
|
|
ParticipantsScreenshareOn []string `json:"participants_screenshare_on"`
|
|
ParticipantsScreenshareOff []string `json:"participants_screenshare_off"`
|
|
CanvasThreadTS string `json:"canvas_thread_ts,omitempty"`
|
|
ThreadRootTS string `json:"thread_root_ts,omitempty"`
|
|
Channels []string `json:"channels"`
|
|
IsDMCall bool `json:"is_dm_call"`
|
|
WasRejected bool `json:"was_rejected"`
|
|
WasMissed bool `json:"was_missed"`
|
|
WasAccepted bool `json:"was_accepted"`
|
|
HasEnded bool `json:"has_ended"`
|
|
BackgroundID string `json:"background_id,omitempty"`
|
|
CanvasBackground string `json:"canvas_background,omitempty"`
|
|
IsPrewarmed bool `json:"is_prewarmed,omitempty"`
|
|
IsScheduled bool `json:"is_scheduled,omitempty"`
|
|
Recording *SHRoomRecording `json:"recording,omitempty"`
|
|
Locale string `json:"locale,omitempty"`
|
|
AttachedFileIDs []string `json:"attached_file_ids,omitempty"`
|
|
MediaBackendType string `json:"media_backend_type"`
|
|
DisplayID string `json:"display_id,omitempty"`
|
|
ExternalUniqueID string `json:"external_unique_id"`
|
|
AppID string `json:"app_id"`
|
|
CallFamily string `json:"call_family,omitempty"`
|
|
HuddleLink string `json:"huddle_link,omitempty"`
|
|
}
|
|
|
|
// SHRoomHuddle holds the huddle-specific metadata on sh_room events.
|
|
type SHRoomHuddle struct {
|
|
ChannelID string `json:"channel_id"`
|
|
}
|
|
|
|
// SHRoomJoinEvent is fired when a user joins a Slack Call/Huddle room.
|
|
type SHRoomJoinEvent struct {
|
|
Type string `json:"type"`
|
|
Room SHRoom `json:"room"`
|
|
User string `json:"user"`
|
|
Huddle *SHRoomHuddle `json:"huddle,omitempty"`
|
|
EventTS string `json:"event_ts"`
|
|
TS string `json:"ts"`
|
|
}
|
|
|
|
// SHRoomLeaveEvent is fired when a user leaves a Slack Call/Huddle room.
|
|
type SHRoomLeaveEvent struct {
|
|
Type string `json:"type"`
|
|
Room SHRoom `json:"room"`
|
|
User string `json:"user"`
|
|
Huddle *SHRoomHuddle `json:"huddle,omitempty"`
|
|
EventTS string `json:"event_ts"`
|
|
TS string `json:"ts"`
|
|
}
|
|
|
|
// SHRoomUpdateEvent is fired when a Slack Call/Huddle room is updated.
|
|
type SHRoomUpdateEvent struct {
|
|
Type string `json:"type"`
|
|
Room SHRoom `json:"room"`
|
|
User string `json:"user"`
|
|
Huddle *SHRoomHuddle `json:"huddle,omitempty"`
|
|
EventTS string `json:"event_ts"`
|
|
TS string `json:"ts"`
|
|
}
|
|
|
|
// AppsUninstalledEvent represents the apps_uninstalled event sent via RTM
|
|
// when one or more apps are uninstalled from the workspace.
|
|
type AppsUninstalledEvent struct {
|
|
Type string `json:"type"`
|
|
}
|
|
|
|
// ActivityEvent represents the activity event sent via RTM. This is an
|
|
// internal Slack event that fires during normal workspace usage (e.g. new
|
|
// messages, bundle updates).
|
|
type ActivityEvent struct {
|
|
Type string `json:"type"`
|
|
SubType string `json:"subtype"`
|
|
Key string `json:"key"`
|
|
Entry json.RawMessage `json:"entry"`
|
|
EventTimestamp string `json:"event_ts"`
|
|
}
|
|
|
|
// BadgeCountsUpdatedEvent represents the badge_counts_updated event sent via
|
|
// RTM when notification badge counts change.
|
|
type BadgeCountsUpdatedEvent struct {
|
|
Type string `json:"type"`
|
|
}
|