package gateway import ( "strings" "github.com/42wim/matterbridge/bridge/config" ) // returns true if a command was registered (therefore a should not be relayed func (r *Router) handleCommand(msg *config.Message) bool { help := `!optout - opt out from all message relaying !optoutmedia - only opt out from relaying attachments !optin - opt back into chat relaying !setwelcome - set channel welcome message (admin) !unsetwelcome - clear channel welcome message (admin) !help - display this message` isAdmin := r.isAdmin(msg) addTextFromCaptions(msg) cmd := msg.Text switch { case cmd == "!help": r.logger.Debug("!help") r.replyCmd(msg, help) case cmd == "!chatId": r.logger.Infof("!chatId: %s", msg.Channel) case cmd == "!userId": r.logger.Infof("!userId: %s", msg.UserID) case cmd == "!ping": r.logger.Debug("!pong: %s,%s", msg.Channel, msg.UserID) r.replyCmd(msg, "pong!") case cmd == "!pingdm": r.logger.Debug("!pongdm: %s,%s", msg.Channel, msg.UserID) r.replyDM(msg, "pong!") case cmd == "!optin": r.logger.Debugf("!optin: %s", msg.UserID) r.handleOptOutCmd(msg, OptIn) case cmd == "!optout": r.logger.Debugf("!optout: %s", msg.UserID) r.handleOptOutCmd(msg, OptOut) case cmd == "!optoutmedia": r.logger.Debugf("!optoutmedia: %s", msg.UserID) r.handleOptOutCmd(msg, OptOutMediaOnly) case isAdmin && strings.HasPrefix(cmd, "!setwelcome"): r.logger.Debugf("!setwelcome: %s - %+v", msg.Channel, msg) r.handleWelcomeCmd(msg, msg) case isAdmin && strings.HasPrefix(cmd, "!unsetwelcome"): r.logger.Debugf("!unsetwelcome: %s", msg.Channel) r.handleWelcomeCmd(msg, nil) case cmd == "!echowelcome": r.logger.Debugf("!echowelcome: %s,%s", msg.Channel, msg.UserID) r.handleEchoWelcomeCmd(msg) default: return false } return true } func (r *Router) isAdmin(msg *config.Message) bool { admins, _ := r.GetStringSlice("Admins") for _, ID := range admins { if msg.UserID == ID { return true } } return false } func addTextFromCaptions(msg *config.Message) { for _, f := range msg.Extra["file"] { fi := f.(config.FileInfo) msg.Text += fi.Comment } } func (r *Router) replyCmd(msg *config.Message, str string) { srcBridge := r.getBridge(msg.Account) reply := config.Message{ Text: str, Channel: msg.Channel, Account: msg.Account, Username: "", UserID: "", Protocol: msg.Protocol, Gateway: msg.Gateway, ParentID: msg.ID, } srcBridge.Send(reply) } func (r *Router) replyDM(msg *config.Message, str string) { srcBridge := r.getBridge(msg.Account) reply := config.Message{ Text: str, Channel: msg.UserID, Account: msg.Account, Username: "", UserID: "", Protocol: msg.Protocol, Gateway: msg.Gateway, } srcBridge.Send(reply) } func (r *Router) sendDM(msg *config.Message, dmChannel string) { srcBridge := r.getBridge(msg.Account) msg.Channel = dmChannel msg.Username = "" msg.UserID = "" msg.ID = "" msg.Event = "" srcBridge.Send(*msg) } func (r *Router) handleOptOutCmd(msg *config.Message, newStatus OptOutStatus) { err := r.setOptOutStatus(msg.UserID, newStatus) reply := "Successfully set message relay preferences." if err != nil { reply = "Error setting message relay preferences, try again later or contact the moderators." } r.replyCmd(msg, reply) } func (r *Router) handleWelcomeCmd(msg *config.Message, welcomeMsg *config.Message) { if welcomeMsg != nil { welcomeMsg.Text = strings.Replace(welcomeMsg.Text, "!setwelcome ", "", 1) for i, f := range welcomeMsg.Extra["file"] { fi := f.(config.FileInfo) fi.Comment = strings.Replace(fi.Comment, "!setwelcome ", "", 1) welcomeMsg.Extra["file"][i] = fi } } err := r.setWelcomeMessage(msg.Channel, welcomeMsg) reply := "Successfully set welcome message for channel." if welcomeMsg == nil { reply = "Successfully removed welcome message for channel." } if err != nil { reply = "Error setting channel welcome message, try again later or contact the moderators." } r.replyCmd(msg, reply) } func (r *Router) handleEchoWelcomeCmd(msg *config.Message) { msg.Event = config.EventWelcomeMsg if r.getWelcomeMessage(msg.Channel) == nil { r.replyCmd(msg, "No welcome message configured, set with !setwelcome") return } r.handleEventWelcome(msg) }