code: func (mod *IrcBee) Action(action bees.Action) []bees.Placeholder {
  	outs := []bees.Placeholder{}
  	var sendFunc func(t, msg string)
  
  	switch action.Name {
  	case "notice":
  		sendFunc = mod.client.Notice
  		fallthrough
  	case "send":
  		if sendFunc == nil {
  			sendFunc = mod.client.Privmsg
  		}
  		tos := []string{}
  		text := ""
  		action.Options.Bind("text", &text)
  
  		for _, opt := range action.Options {
  			if opt.Name == "channel" {
  				tos = append(tos, opt.Value.(string))
  			}
  		}
  
  		for _, recv := range tos {
  			if recv == "*" {
  				// special: send to all joined channels
  				for _, to := range mod.channels {
  					sendFunc(to, text)
  				}
  			} else {
  				// needs stripping hostname when sending to user!host
  				if strings.Index(recv, "!") > 0 {
  					recv = recv[0:strings.Index(recv, "!")]
  				}
  
  				sendFunc(recv, text)
  			}
  		}
  
  	case "join":
  		for _, opt := range action.Options {
  			if opt.Name == "channel" {
  				mod.join(opt.Value.(string))
  			}
  		}
  	case "part":
  		for _, opt := range action.Options {
  			if opt.Name == "channel" {
  				mod.part(opt.Value.(string))
  			}
  		}
  
  	case "kick":
  		var c, n, m string
  		action.Options.Bind("channel", &c)
  		action.Options.Bind("user", &n)
  		action.Options.Bind("message", &m)
  		mod.client.Kick(c, n, m)
  
  	default:
  		panic("Unknown action triggered in " + mod.Name() + ": " + action.Name)
  	}
  
  	return outs
  }
docs: // Action triggers the action passed to it.