Skip to content

Commit

Permalink
Merge 802988e into 8eeae22
Browse files Browse the repository at this point in the history
  • Loading branch information
pajlada authored Oct 21, 2018
2 parents 8eeae22 + 802988e commit a8be4d2
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 19 deletions.
4 changes: 3 additions & 1 deletion README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,19 @@ client.OnNewMessage(func(channel string, user twitch.User, message twitch.Messag
client.OnNewRoomstateMessage(func(channel string, user twitch.User, message twitch.Message) {})
client.OnNewClearchatMessage(func(channel string, user twitch.User, message twitch.Message) {})
client.OnNewUsernoticeMessage(func(channel string, user twitch.User, message twitch.Message) {})
client.OnNewNoticeMessage(func(channel string, user twitch.User, message twitch.Message) {})
client.OnNewUserstateMessage(func(channel string, user twitch.User, message twitch.Message) {})
client.OnUserJoin(func(channel, user string) {})
client.OnUserPart(func(channel, user string) {})
```
### Message Types

If you ever need more than basic PRIVMSG, this might be for you.
These are the 5 major message types currently supported:
These are the 6 major message types currently supported:

PRIVMSG
WHISPER
ROOMSTATE
CLEARCHAT
USERNOTICE
NOTICE
10 changes: 10 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ type Client struct {
onNewRoomstateMessage func(channel string, user User, message Message)
onNewClearchatMessage func(channel string, user User, message Message)
onNewUsernoticeMessage func(channel string, user User, message Message)
onNewNoticeMessage func(channel string, user User, message Message)
onNewUserstateMessage func(channel string, user User, message Message)
onUserJoin func(channel, user string)
onUserPart func(channel, user string)
Expand Down Expand Up @@ -111,6 +112,11 @@ func (c *Client) OnNewUsernoticeMessage(callback func(channel string, user User,
c.onNewUsernoticeMessage = callback
}

// OnNewUsernoticeMessage attach callback to new notice message such as hosts
func (c *Client) OnNewNoticeMessage(callback func(channel string, user User, message Message)) {
c.onNewNoticeMessage = callback
}

// OnNewUserstateMessage attach callback to new userstate
func (c *Client) OnNewUserstateMessage(callback func(channel string, user User, message Message)) {
c.onNewUserstateMessage = callback
Expand Down Expand Up @@ -320,6 +326,10 @@ func (c *Client) handleLine(line string) {
if c.onNewUsernoticeMessage != nil {
c.onNewUsernoticeMessage(channel, *user, *clientMessage)
}
case NOTICE:
if c.onNewNoticeMessage != nil {
c.onNewNoticeMessage(channel, *user, *clientMessage)
}
case USERSTATE:
if c.onNewUserstateMessage != nil {
c.onNewUserstateMessage(channel, *user, *clientMessage)
Expand Down
47 changes: 47 additions & 0 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,53 @@ func TestCanReceiveUSERNOTICEMessage(t *testing.T) {
assertStringsEqual(t, "16", received)
}

func checkNoticeMessage(t *testing.T, testMessage string, requirements map[string]string) {
received := map[string]string{}
wait := make(chan struct{})

host := startServer(t, postMessageOnConnect(testMessage), nothingOnMessage)
client := newTestClient(host)

client.OnNewNoticeMessage(func(channel string, user User, message Message) {
received["msg-id"] = message.Tags["msg-id"]
received["channel"] = channel
received["text"] = message.Text
received["raw"] = message.Raw
close(wait)
})

go client.Connect()

select {
case <-wait:
case <-time.After(time.Second * 3):
t.Fatal("no message sent")
}

assertStringsEqual(t, testMessage, received["raw"])
for key, requirement := range requirements {
assertStringsEqual(t, requirement, received[key])
}
}

func TestCanReceiveNOTICEMessage(t *testing.T) {
testMessage := `@msg-id=host_on :tmi.twitch.tv NOTICE #pajlada :Now hosting KKona.`
checkNoticeMessage(t, testMessage, map[string]string{
"msg-id": "host_on",
"channel": "pajlada",
"text": "Now hosting KKona.",
})
}

func TestCanReceiveNOTICEMessageTimeout(t *testing.T) {
testMessage := `@msg-id=timeout_success :tmi.twitch.tv NOTICE #forsen :thedl0rd has been timed out for 8 minutes 11 seconds.`
checkNoticeMessage(t, testMessage, map[string]string{
"msg-id": "timeout_success",
"channel": "forsen",
"text": "thedl0rd has been timed out for 8 minutes 11 seconds.",
})
}

func TestCanReceiveUSERStateMessage(t *testing.T) {
testMessage := `@badges=moderator/1;color=;display-name=blahh;emote-sets=0;mod=1;subscriber=0;user-type=mod :tmi.twitch.tv USERSTATE #nothing`

Expand Down
44 changes: 26 additions & 18 deletions message.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ const (
USERNOTICE MessageType = 4
// USERSTATE messages
USERSTATE MessageType = 5
// NOTICE messages like sub mode, host on
NOTICE MessageType = 6
)

type message struct {
Expand Down Expand Up @@ -89,16 +91,7 @@ func parseOtherMessage(line string) *message {
split := strings.Split(line, " ")
msg.Raw = line

switch split[2] {
case "ROOMSTATE":
msg.Type = ROOMSTATE
case "USERNOTICE":
msg.Type = USERNOTICE
case "CLEARCHAT":
msg.Type = CLEARCHAT
case "USERSTATE":
msg.Type = USERSTATE
}
msg.Type = parseMessageType(split[2])
msg.Tags = make(map[string]string)

// Parse out channel if it exists in this line
Expand Down Expand Up @@ -126,6 +119,28 @@ func parseOtherMessage(line string) *message {
return msg
}

func parseMessageType(messageType string) MessageType {
var msgType MessageType
switch messageType {
case "PRIVMSG":
msgType = PRIVMSG
case "WHISPER":
msgType = WHISPER
case "CLEARCHAT":
msgType = CLEARCHAT
case "NOTICE":
msgType = NOTICE
case "ROOMSTATE":
msgType = ROOMSTATE
case "USERSTATE":
msgType = USERSTATE
case "USERNOTICE":
msgType = USERNOTICE
}

return msgType
}

func parseMiddle(middle string) (string, MessageType, string) {
var username string
var msgType MessageType
Expand All @@ -144,14 +159,7 @@ func parseMiddle(middle string) (string, MessageType, string) {
start = i + 1
} else {
typ := middle[start:i]
switch typ {
case "PRIVMSG":
msgType = PRIVMSG
case "WHISPER":
msgType = WHISPER
case "CLEARCHAT":
msgType = CLEARCHAT
}
msgType = parseMessageType(typ)
middle = middle[i:]
}
}
Expand Down

0 comments on commit a8be4d2

Please sign in to comment.