3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-12-23 03:02:48 +01:00

add a type for CTCP-encoded strings, and NOTICEs for error cases

This commit is contained in:
Edmund Huber 2014-03-23 06:47:21 +01:00
parent 6267b6a40c
commit 34b01b115e
5 changed files with 38 additions and 14 deletions

View File

@ -966,7 +966,7 @@ func NewTheaterCommand(args []string) (Command, error) {
return &TheaterActionCommand{ return &TheaterActionCommand{
channel: NewName(args[1]), channel: NewName(args[1]),
asNick: NewName(args[2]), asNick: NewName(args[2]),
action: NewText(args[3]), action: NewCTCPText(args[3]),
}, nil }, nil
} else { } else {
return nil, ErrParseCommand return nil, ErrParseCommand

View File

@ -99,6 +99,10 @@ func RplPrivMsg(source Identifiable, target Identifiable, message Text) string {
return NewStringReply(source, PRIVMSG, "%s :%s", target.Nick(), message) return NewStringReply(source, PRIVMSG, "%s :%s", target.Nick(), message)
} }
func RplCTCPAction(source Identifiable, target Identifiable, action CTCPText) string {
return RplPrivMsg(source, target, NewText(fmt.Sprintf("\x01ACTION %s\x01", action)))
}
func RplNotice(source Identifiable, target Identifiable, message Text) string { func RplNotice(source Identifiable, target Identifiable, message Text) string {
return NewStringReply(source, NOTICE, "%s :%s", target.Nick(), message) return NewStringReply(source, NOTICE, "%s :%s", target.Nick(), message)
} }

View File

@ -64,3 +64,12 @@ func NewText(str string) Text {
func (text Text) String() string { func (text Text) String() string {
return string(text) return string(text)
} }
// CTCPText is text suitable escaped for CTCP.
type CTCPText string
var ctcpEscaper = strings.NewReplacer("\x00", "\x200", "\n", "\x20n", "\r", "\x20r")
func NewCTCPText(str string) CTCPText {
return CTCPText(ctcpEscaper.Replace(str))
}

View File

@ -51,9 +51,12 @@ func (m *TheaterIdentifyCommand) HandleServer(s *Server) {
return return
} }
if !channel.members.AnyHasMode(Theater) { if channel.members.AnyHasMode(Theater) {
channel.members[client][Theater] = true client.Reply(RplNotice(s, client, "someone else is +T in this channel"))
return
} }
channel.members[client][Theater] = true
} }
type TheaterPrivMsgCommand struct { type TheaterPrivMsgCommand struct {
@ -69,6 +72,7 @@ func (cmd *TheaterPrivMsgCommand) String() string {
} }
func (m *TheaterPrivMsgCommand) HandleServer(s *Server) { func (m *TheaterPrivMsgCommand) HandleServer(s *Server) {
client := m.Client() client := m.Client()
if !m.channel.IsChannel() { if !m.channel.IsChannel() {
client.ErrNoSuchChannel(m.channel) client.ErrNoSuchChannel(m.channel)
return return
@ -80,18 +84,21 @@ func (m *TheaterPrivMsgCommand) HandleServer(s *Server) {
return return
} }
if channel.members.HasMode(client, Theater) { if !channel.members.HasMode(client, Theater) {
client.Reply(RplNotice(s, client, "you are not +T"))
return
}
for member := range channel.members { for member := range channel.members {
member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, m.message)) member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, m.message))
} }
} }
}
type TheaterActionCommand struct { type TheaterActionCommand struct {
BaseCommand BaseCommand
channel Name channel Name
asNick Name asNick Name
action Text action CTCPText
} }
func (cmd *TheaterActionCommand) String() string { func (cmd *TheaterActionCommand) String() string {
@ -100,7 +107,8 @@ func (cmd *TheaterActionCommand) String() string {
func (m *TheaterActionCommand) HandleServer(s *Server) { func (m *TheaterActionCommand) HandleServer(s *Server) {
client := m.Client() client := m.Client()
if m.channel.IsChannel() {
if !m.channel.IsChannel() {
client.ErrNoSuchChannel(m.channel) client.ErrNoSuchChannel(m.channel)
return return
} }
@ -111,9 +119,12 @@ func (m *TheaterActionCommand) HandleServer(s *Server) {
return return
} }
if channel.members.HasMode(client, Theater) { if !channel.members.HasMode(client, Theater) {
client.Reply(RplNotice(s, client, "you are not +T"))
return
}
for member := range channel.members { for member := range channel.members {
member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, NewText(fmt.Sprintf("\001ACTION %s\001", m.action)))) member.Reply(RplCTCPAction(TheaterClient(m.asNick), channel, m.action))
}
} }
} }

View File

@ -85,7 +85,7 @@ func (members MemberSet) HasMode(member *Client, mode ChannelMode) bool {
func (members MemberSet) AnyHasMode(mode ChannelMode) bool { func (members MemberSet) AnyHasMode(mode ChannelMode) bool {
for _, modes := range members { for _, modes := range members {
if modes[Theater] { if modes[mode] {
return true return true
} }
} }