github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/system/stream/event_handler.go (about) 1 // This file is part of the Smart Home 2 // Program complex distribution https://github.com/e154/smart-home 3 // Copyright (C) 2023, Filippov Alex 4 // 5 // This library is free software: you can redistribute it and/or 6 // modify it under the terms of the GNU Lesser General Public 7 // License as published by the Free Software Foundation; either 8 // version 3 of the License, or (at your option) any later version. 9 // 10 // This library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 // Library General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public 16 // License along with this library. If not, see 17 // <https://www.gnu.org/licenses/>. 18 19 package stream 20 21 import ( 22 "encoding/json" 23 24 "github.com/e154/smart-home/common/events" 25 "github.com/e154/smart-home/plugins/webpush" 26 ) 27 28 type eventHandler struct { 29 broadcast func(query string, message []byte) 30 directMessage func(userID int64, sessionID string, query string, message []byte) 31 } 32 33 func NewEventHandler(broadcast func(query string, message []byte), 34 directMessage func(userID int64, sessionID string, query string, message []byte)) *eventHandler { 35 return &eventHandler{ 36 broadcast: broadcast, 37 directMessage: directMessage, 38 } 39 } 40 41 func (e *eventHandler) eventHandler(_ string, message interface{}) { 42 43 switch v := message.(type) { 44 45 // entities 46 case events.EventStateChanged: 47 go e.eventStateChangedHandler(message) 48 case events.EventLastStateChanged: 49 go e.eventStateChangedHandler(message) 50 case events.EventCreatedEntityModel: 51 case events.EventUpdatedEntityModel: 52 case events.EventUpdatedMetric: 53 go e.event(message) 54 case events.CommandUnloadEntity: 55 case events.EventEntityLoaded: 56 go e.event(message) 57 case events.EventEntityUnloaded: 58 go e.event(message) 59 case events.EventEntitySetState: 60 61 // notifications 62 case webpush.EventNewWebPushPublicKey: 63 go e.eventNewWebPushPublicKey(v) 64 case webpush.EventUserDevices: 65 go e.eventUserDevices(v) 66 case events.EventDirectMessage: 67 go e.eventDirectMessage(v.UserID, v.SessionID, v.Query, v.Message) 68 69 // plugins 70 case events.EventPluginLoaded, 71 events.EventPluginUnloaded: 72 go e.event(message) 73 74 // tasks 75 case events.EventTaskLoaded, 76 events.EventTaskUnloaded, 77 events.EventTaskCompleted: 78 go e.event(message) 79 80 // triggers 81 case events.EventTriggerLoaded, 82 events.EventTriggerUnloaded, 83 events.EventTriggerCompleted: 84 go e.event(message) 85 86 // actions 87 case events.EventActionCompleted: 88 go e.event(message) 89 90 // mqtt 91 case events.EventMqttNewClient: 92 go e.event(message) 93 94 // backup 95 case events.EventCreatedBackup, 96 events.EventRemovedBackup, 97 events.EventUploadedBackup, 98 events.EventStartedRestore: 99 go e.event(message) 100 101 // variables 102 case events.EventRemovedVariableModel, 103 events.EventUpdatedVariableModel: 104 go e.event(message) 105 106 // scripts 107 case events.EventUpdatedScriptModel, 108 events.EventRemovedScriptModel, 109 events.EventCreatedScriptModel: 110 go e.event(message) 111 112 // version 113 case events.EventServerVersion: 114 go e.eventDirectMessage(v.UserId(), v.SessionID, "event_server_version", v.Version) 115 116 default: 117 118 } 119 } 120 121 func (e *eventHandler) eventNewWebPushPublicKey(event webpush.EventNewWebPushPublicKey) { 122 b, _ := json.Marshal(event) 123 if event.UserID != 0 { 124 e.directMessage(event.UserID, event.SessionID, "event_new_webpush_public_key", b) 125 return 126 } 127 e.broadcast("event_new_webpush_public_key", b) 128 } 129 130 func (e *eventHandler) eventUserDevices(event webpush.EventUserDevices) { 131 b, _ := json.Marshal(event) 132 if event.UserID != 0 { 133 e.directMessage(event.UserID, event.SessionID, "event_user_devices", b) 134 return 135 } 136 e.broadcast("event_user_devices", b) 137 } 138 139 func (e *eventHandler) eventStateChangedHandler(msg interface{}) { 140 //todo optimize 141 b, _ := json.Marshal(msg) 142 e.broadcast("state_changed", b) 143 } 144 145 func (e *eventHandler) eventDirectMessage(userID int64, sessionID string, query string, msg interface{}) { 146 b, _ := json.Marshal(msg) 147 e.directMessage(userID, sessionID, query, b) 148 } 149 150 func (e *eventHandler) event(msg interface{}) { 151 b, _ := json.Marshal(msg) 152 e.broadcast(events.EventName(msg), b) 153 }