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  }