diff --git a/doc/soju.1.scd b/doc/soju.1.scd index 852f30a..2960c69 100644 --- a/doc/soju.1.scd +++ b/doc/soju.1.scd @@ -329,6 +329,11 @@ abbreviated form, for instance *network* can be abbreviated as *net* or just *server status* Show some bouncer statistics. Only admins can query this information. +*server notice* + Broadcast a notice. All currently connected bouncer users will receive the + message from the special _BouncerServ_ service. Only admins can broadcast a + notice. + # AUTHORS Maintained by Simon Ser , who is assisted by other diff --git a/service.go b/service.go index 20b4167..cca1f5a 100644 --- a/service.go +++ b/service.go @@ -294,6 +294,11 @@ func init() { handle: handleServiceServerStatus, admin: true, }, + "notice": { + desc: "broadcast a notice to all connected bouncer users", + handle: handleServiceServerNotice, + admin: true, + }, }, admin: true, }, @@ -978,3 +983,22 @@ func handleServiceServerStatus(dc *downstreamConn, params []string) error { sendServicePRIVMSG(dc, fmt.Sprintf("%v/%v users, %v downstreams, %v networks, %v channels", serverStats.Users, dbStats.Users, serverStats.Downstreams, dbStats.Networks, dbStats.Channels)) return nil } + +func handleServiceServerNotice(dc *downstreamConn, params []string) error { + if len(params) != 1 { + return fmt.Errorf("expected exactly one argument") + } + text := params[0] + + dc.logger.Printf("broadcasting bouncer-wide NOTICE: %v", text) + + broadcastMsg := &irc.Message{ + Prefix: servicePrefix, + Command: "NOTICE", + Params: []string{"$" + dc.srv.Hostname, text}, + } + dc.srv.forEachUser(func(u *user) { + u.events <- eventBroadcast{broadcastMsg} + }) + return nil +}