mirror of
https://github.com/ergochat/ergo.git
synced 2024-12-22 18:52:41 +01:00
add a type for CTCP-encoded strings, and NOTICEs for error cases
This commit is contained in:
parent
6267b6a40c
commit
34b01b115e
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
|
@ -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,10 +84,13 @@ func (m *TheaterPrivMsgCommand) HandleServer(s *Server) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if channel.members.HasMode(client, Theater) {
|
if !channel.members.HasMode(client, Theater) {
|
||||||
for member := range channel.members {
|
client.Reply(RplNotice(s, client, "you are not +T"))
|
||||||
member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, m.message))
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for member := range channel.members {
|
||||||
|
member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, m.message))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +98,7 @@ 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) {
|
||||||
for member := range channel.members {
|
client.Reply(RplNotice(s, client, "you are not +T"))
|
||||||
member.Reply(RplPrivMsg(TheaterClient(m.asNick), channel, NewText(fmt.Sprintf("\001ACTION %s\001", m.action))))
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for member := range channel.members {
|
||||||
|
member.Reply(RplCTCPAction(TheaterClient(m.asNick), channel, m.action))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user