wide/notification/notifications.go

113 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 通知.
package notification
import (
"net/http"
"time"
"strconv"
"github.com/b3log/wide/event"
"github.com/b3log/wide/i18n"
"github.com/b3log/wide/util"
"github.com/golang/glog"
"github.com/gorilla/websocket"
)
const (
Error = "ERROR" // 通知.严重程度ERROR
Warn = "WARN" // 通知.严重程度WARN
Info = "INFO" // 通知.严重程度INFO
Setup = "Setup" // 通知.类型:安装
)
// 通知结构.
type Notification struct {
event *event.Event
Type string `json:"type"`
Severity string `json:"severity"`
Message string `json:"message"`
}
// 通知通道.
// <sid, *util.WSChannel>
var notificationWSs = map[string]*util.WSChannel{}
// 用户事件处理:将事件转为通知,并通过通知通道推送给前端.
// 当用户事件队列接收到事件时将会调用该函数进行处理.
func event2Notification(e *event.Event) {
if nil == notificationWSs[e.Sid] {
return
}
wsChannel := notificationWSs[e.Sid]
var notification Notification
switch e.Code {
case event.EvtCodeGocodeNotFound:
notification = Notification{event: e, Type: Setup, Severity: Error}
case event.EvtCodeIDEStubNotFound:
notification = Notification{event: e, Type: Setup, Severity: Error}
default:
glog.Warningf("Can't handle event[code=%d]", e.Code)
return
}
// 消息国际化处理
notification.Message = i18n.Get(wsChannel.Request, "notification_"+strconv.Itoa(e.Code)).(string)
wsChannel.Conn.WriteJSON(&notification)
// 更新通道最近使用时间
wsChannel.Time = time.Now()
}
// 建立通知通道.
func WSHandler(w http.ResponseWriter, r *http.Request) {
// TODO: 会话校验
sid := r.URL.Query()["sid"][0]
conn, _ := websocket.Upgrade(w, r, nil, 1024, 1024)
wsChan := util.WSChannel{Sid: sid, Conn: conn, Request: r, Time: time.Now()}
notificationWSs[sid] = &wsChan
ret := map[string]interface{}{"output": "Notification initialized", "cmd": "init-notification"}
wsChan.Conn.WriteJSON(&ret)
glog.V(4).Infof("Open a new [Notification] with session [%s], %d", sid, len(notificationWSs))
// 初始化用户事件队列
event.InitUserQueue(sid, event.HandleFunc(event2Notification))
input := map[string]interface{}{}
for {
if err := wsChan.Conn.ReadJSON(&input); err != nil {
if err.Error() == "EOF" {
return
}
if err.Error() == "unexpected EOF" {
return
}
glog.Error("Notification WS ERROR: " + err.Error())
return
}
output := ""
ret = map[string]interface{}{"output": output, "cmd": "notification-output"}
if err := wsChan.Conn.WriteJSON(&ret); err != nil {
glog.Error("Notification WS ERROR: " + err.Error())
return
}
wsChan.Time = time.Now()
}
}