mirror of https://github.com/fluffle/goirc
Allow commands on a channel to be used from a privmsg
This commit is contained in:
parent
ce202d03f1
commit
23dfd26d9f
37
auth.go
37
auth.go
|
@ -88,25 +88,48 @@ func removeUser(conn *irc.Conn, channel, nick string) (string, bool) {
|
||||||
return n.Host, true
|
return n.Host, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this allows target to be a channel or a privmsg in which the channel is the first argument
|
||||||
// passing a flag of "" will check if the user has any access
|
// passing a flag of "" will check if the user has any access
|
||||||
func hasAccess(conn *irc.Conn, channel, nick, flag string) bool {
|
// returns the channel the user has access on and remaining args
|
||||||
|
// or a blank channel if the user doesn't have access on that channel
|
||||||
|
func hasAccess(conn *irc.Conn, nick, target, args, flag string) (string, string) {
|
||||||
n := conn.GetNick(nick)
|
n := conn.GetNick(nick)
|
||||||
if n == nil {
|
if n == nil {
|
||||||
return false
|
return "", args
|
||||||
}
|
}
|
||||||
|
|
||||||
if owner, _ := auth.String(conn.Network, "owner"); owner == n.Host {
|
// figure out what the channel and args are
|
||||||
return true
|
var channel string
|
||||||
|
if isChannel(target) {
|
||||||
|
channel = target
|
||||||
|
} else {
|
||||||
|
split := strings.Split(args, " ", 2)
|
||||||
|
if isChannel(split[0]) {
|
||||||
|
channel = split[0]
|
||||||
|
if len(split) == 2 {
|
||||||
|
args = split[1]
|
||||||
|
} else {
|
||||||
|
args = ""
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "", args
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// actually check access
|
||||||
|
if owner, _ := auth.String(conn.Network, "owner"); owner == n.Host {
|
||||||
|
return channel, args
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
flags, err := auth.String(conn.Network + " " + channel, n.Host)
|
flags, err := auth.String(conn.Network + " " + channel, n.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return "", args
|
||||||
}
|
}
|
||||||
if strings.Index(flags, flag) > -1 {
|
if strings.Index(flags, flag) > -1 {
|
||||||
return true
|
return channel, args
|
||||||
}
|
}
|
||||||
return false
|
return "", args
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateAuth() os.Error {
|
func updateAuth() os.Error {
|
||||||
|
|
54
handler.go
54
handler.go
|
@ -199,8 +199,9 @@ func sayTr(conn *irc.Conn, target string, data interface{}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func add(conn *irc.Conn, nick, args, channel string) {
|
func add(conn *irc.Conn, nick, args, target string) {
|
||||||
if !isChannel(channel) || !hasAccess(conn, channel, nick, "a") {
|
channel, args := hasAccess(conn, nick, target, args, "a")
|
||||||
|
if channel == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
split := strings.Fields(args)
|
split := strings.Fields(args)
|
||||||
|
@ -209,13 +210,14 @@ func add(conn *irc.Conn, nick, args, channel string) {
|
||||||
}
|
}
|
||||||
host, nflags := addAccess(conn, channel, split[0], strings.TrimSpace(split[1]))
|
host, nflags := addAccess(conn, channel, split[0], strings.TrimSpace(split[1]))
|
||||||
if host == "" {
|
if host == "" {
|
||||||
say(conn, channel, "Could not find nick %s", split[0])
|
say(conn, target, "Could not find nick %s", split[0])
|
||||||
} else {
|
} else {
|
||||||
say(conn, channel, "%s now has flags %s", host, nflags)
|
say(conn, target, "%s now has flags %s", host, nflags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func remove(conn *irc.Conn, nick, args, channel string) {
|
func remove(conn *irc.Conn, nick, args, target string) {
|
||||||
if !isChannel(channel) || !hasAccess(conn, channel, nick, "a") {
|
channel, args := hasAccess(conn, nick, target, args, "a")
|
||||||
|
if channel == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
split := strings.Fields(args)
|
split := strings.Fields(args)
|
||||||
|
@ -223,24 +225,25 @@ func remove(conn *irc.Conn, nick, args, channel string) {
|
||||||
if len(split) == 2 {
|
if len(split) == 2 {
|
||||||
host, nflags := removeAccess(conn, channel, split[0], strings.TrimSpace(split[1]))
|
host, nflags := removeAccess(conn, channel, split[0], strings.TrimSpace(split[1]))
|
||||||
if host == "" {
|
if host == "" {
|
||||||
say(conn, channel, "Could not find nick %s", split[0])
|
say(conn, target, "Could not find nick %s", split[0])
|
||||||
} else {
|
} else {
|
||||||
say(conn, channel, "%s now has flags %s", host, nflags)
|
say(conn, target, "%s now has flags %s", host, nflags)
|
||||||
}
|
}
|
||||||
} else if len(split) == 1 {
|
} else if len(split) == 1 {
|
||||||
host, removed := removeUser(conn, channel, split[0])
|
host, removed := removeUser(conn, channel, split[0])
|
||||||
if host == "" {
|
if host == "" {
|
||||||
say(conn, channel, "Could not find nick %s", split[0])
|
say(conn, target, "Could not find nick %s", split[0])
|
||||||
} else if removed {
|
} else if removed {
|
||||||
say(conn, channel, "Removed %s", host)
|
say(conn, target, "Removed %s", host)
|
||||||
} else {
|
} else {
|
||||||
say(conn, channel, "%s did not have any flags", host)
|
say(conn, target, "%s did not have any flags", host)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func flags(conn *irc.Conn, nick, args, channel string) {
|
func flags(conn *irc.Conn, nick, args, target string) {
|
||||||
if !isChannel(channel) || !hasAccess(conn, channel, nick, "") {
|
channel, args := hasAccess(conn, nick, target, args, "")
|
||||||
|
if channel == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,25 +253,26 @@ func flags(conn *irc.Conn, nick, args, channel string) {
|
||||||
}
|
}
|
||||||
n := conn.GetNick(query)
|
n := conn.GetNick(query)
|
||||||
if n == nil {
|
if n == nil {
|
||||||
say(conn, channel, "Could not find nick %s", query)
|
say(conn, target, "Could not find nick %s", query)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if owner, _ := auth.String(conn.Network, "owner"); owner == n.Host {
|
if owner, _ := auth.String(conn.Network, "owner"); owner == n.Host {
|
||||||
say(conn, channel, "%s is the owner", query)
|
say(conn, target, "%s is the owner", query)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
flags, _ := auth.String(conn.Network + " " + channel, n.Host)
|
flags, _ := auth.String(conn.Network + " " + channel, n.Host)
|
||||||
if flags == "" {
|
if flags == "" {
|
||||||
say(conn, channel, "%s has no flags", n.Host)
|
say(conn, target, "%s has no flags", n.Host)
|
||||||
} else {
|
} else {
|
||||||
say(conn, channel, "%s: %s", n.Host, flags)
|
say(conn, target, "%s: %s", n.Host, flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func topic(conn *irc.Conn, nick, args, channel string) {
|
func topic(conn *irc.Conn, nick, args, target string) {
|
||||||
if !isChannel(channel) || !hasAccess(conn, channel, nick, "t") {
|
channel, args := hasAccess(conn, nick, target, args, "t")
|
||||||
|
if channel == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
section := conn.Network + " " + channel
|
section := conn.Network + " " + channel
|
||||||
|
@ -280,13 +284,14 @@ func topic(conn *irc.Conn, nick, args, channel string) {
|
||||||
say(conn, nick, "Basetopic: %s", basetopic)
|
say(conn, nick, "Basetopic: %s", basetopic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func appendtopic(conn *irc.Conn, nick, args, channel string) {
|
func appendtopic(conn *irc.Conn, nick, args, target string) {
|
||||||
if !isChannel(channel) || !hasAccess(conn, channel, nick, "t") {
|
channel, args := hasAccess(conn, nick, target, args, "t")
|
||||||
|
if channel == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c := conn.GetChannel(channel)
|
c := conn.GetChannel(channel)
|
||||||
if c == nil {
|
if c == nil {
|
||||||
say(conn, channel, "Error while getting channel information for %s", channel)
|
say(conn, target, "Error while getting channel information for %s", channel)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,7 +306,8 @@ func appendtopic(conn *irc.Conn, nick, args, channel string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func csay(conn *irc.Conn, nick, args, target string) {
|
func csay(conn *irc.Conn, nick, args, target string) {
|
||||||
if isChannel(target) && hasAccess(conn, target, nick, "t") {
|
channel, args := hasAccess(conn, nick, target, args, "t")
|
||||||
say(conn, target, args)
|
if channel != "" {
|
||||||
|
say(conn, channel, args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue