267 lines
6.6 KiB
Go
267 lines
6.6 KiB
Go
package groupme
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"strconv"
|
|
)
|
|
|
|
func init() {
|
|
|
|
RealTimeHandlers = make(map[string]func(r *PushSubscription, channel string, authToken string, data ...interface{}))
|
|
|
|
//Base Handlers on user channel
|
|
RealTimeHandlers["direct_message.create"] = func(r *PushSubscription, channel string, authToken string, data ...interface{}) {
|
|
b, _ := json.Marshal(data[0])
|
|
out := Message{}
|
|
_ = json.Unmarshal(b, &out)
|
|
|
|
//maybe something with API versioning
|
|
out.ConversationID = out.ChatID
|
|
|
|
if out.UserID.String() == "system" {
|
|
event := struct {
|
|
Event struct {
|
|
Kind string `json:"type"`
|
|
Data interface{}
|
|
}
|
|
}{}
|
|
|
|
err := json.Unmarshal(b, &event)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
rawData, _ := json.Marshal(event.Event.Data)
|
|
handler, ok := RealTimeSystemHandlers[event.Event.Kind]
|
|
if !ok {
|
|
log.Println("Unable to handle system message of type", event.Event.Kind)
|
|
return
|
|
}
|
|
|
|
id := out.GroupID
|
|
if len(id) == 0 {
|
|
id = out.ConversationID
|
|
}
|
|
|
|
handler(r, channel, id, authToken, rawData)
|
|
return
|
|
}
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandlerText); ok {
|
|
h.HandleTextMessage(out)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeHandlers["line.create"] = RealTimeHandlers["direct_message.create"]
|
|
|
|
RealTimeHandlers["like.create"] = func(r *PushSubscription, channel string, authToken string, data ...interface{}) { //should be an associated chatEvent
|
|
}
|
|
|
|
RealTimeHandlers["membership.create"] = func(r *PushSubscription, channel string, authToken string, data ...interface{}) {
|
|
c, _ := data[0].(map[string]interface{})
|
|
id, _ := c["id"].(string)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandlerMembership); ok {
|
|
h.HandleJoin(ID(id))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//following are for each chat
|
|
RealTimeHandlers["favorite"] = func(r *PushSubscription, channel string, authToken string, data ...interface{}) {
|
|
c, ok := data[0].(map[string]interface{})
|
|
if !ok {
|
|
fmt.Println(data, "err")
|
|
return
|
|
}
|
|
e, ok := c["line"]
|
|
if !ok {
|
|
fmt.Println(data, "err")
|
|
return
|
|
}
|
|
d, _ := json.Marshal(e)
|
|
msg := Message{}
|
|
_ = json.Unmarshal(d, &msg)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandlerLike); ok {
|
|
h.HandleLike(msg)
|
|
}
|
|
}
|
|
}
|
|
|
|
//following are for messages from system (administrative/settings changes)
|
|
RealTimeSystemHandlers = make(map[string]func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte))
|
|
|
|
RealTimeSystemHandlers["membership.nickname_changed"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
thing := struct {
|
|
Name string
|
|
User struct {
|
|
ID int
|
|
}
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &thing)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleMemberNewNickname); ok {
|
|
h.HandleNewNickname(id, ID(strconv.Itoa(thing.User.ID)), thing.Name)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
RealTimeSystemHandlers["membership.avatar_changed"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
content := struct {
|
|
AvatarURL string `json:"avatar_url"`
|
|
User struct {
|
|
ID int
|
|
}
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &content)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleMemberNewAvatar); ok {
|
|
h.HandleNewAvatarInGroup(id, ID(strconv.Itoa(content.User.ID)), content.AvatarURL)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
RealTimeSystemHandlers["membership.announce.added"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
data := struct {
|
|
Added []Member `json:"added_users"`
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleMembers); ok {
|
|
h.HandleMembers(id, data.Added, true)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["membership.notifications.removed"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
data := struct {
|
|
Added Member `json:"removed_user"`
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleMembers); ok {
|
|
h.HandleMembers(id, []Member{data.Added}, false)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
RealTimeSystemHandlers["membership.name_change"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
|
|
data := struct {
|
|
Name string
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupName); ok {
|
|
h.HandleGroupName(id, data.Name)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["group.name_change"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
|
|
data := struct {
|
|
Name string
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupName); ok {
|
|
h.HandleGroupName(id, data.Name)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["group.topic_change"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
|
|
data := struct {
|
|
Topic string
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupTopic); ok {
|
|
h.HandleGroupTopic(id, data.Topic)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["group.avatar_change"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
data := struct {
|
|
AvatarURL string `json:"avatar_url"`
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupAvatar); ok {
|
|
h.HandleGroupAvatar(id, data.AvatarURL)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["group.like_icon_set"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
data := struct {
|
|
LikeIcon struct {
|
|
PackID int `json:"pack_id"`
|
|
PackIndex int `json:"pack_index"`
|
|
Type string
|
|
} `json:"like_icon"`
|
|
}{}
|
|
_ = json.Unmarshal(rawData, &data)
|
|
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupLikeIcon); ok {
|
|
h.HandleLikeIcon(id, data.LikeIcon.PackID, data.LikeIcon.PackIndex, data.LikeIcon.Type)
|
|
}
|
|
}
|
|
}
|
|
|
|
RealTimeSystemHandlers["group.like_icon_removed"] = func(r *PushSubscription, channel string, id ID, authToken string, rawData []byte) {
|
|
handlers := r.handlers[authToken]
|
|
|
|
for _, h := range handlers {
|
|
if h, ok := h.(HandleGroupLikeIcon); ok {
|
|
h.HandleLikeIcon(id, 0, 0, "")
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|