[{"server":null,"owner":null,"id":"3524834a-c2b1-4fed-b014-15fea8fbe691","params":{"result":{"value":null,"datetime":1558337800,"status":null,"version":0},"hash":{"value":"mcsq+/ivt3jZZhOGTcJwbg==","datetime":1563529423,"status":null,"version":0},"enabled":{"value":true,"datetime":1558337800,"status":null,"version":0},"error_text":{"value":null,"datetime":1558424417,"status":null,"version":0},"type":{"value":"EgsObjectUpdated","datetime":1563528679,"status":null,"version":0},"settings":{"value":"{\"table\":\"{\\r\\n    \\\"VideoCamera\\\": [ \\\"alarm_*\\\", \\\"error_*\\\" ],\\r\\n     \\\"b5214f7d-c032-4db1-8af3-614ff0aed787\\\": \\\"*\\\"\\r\\n}\"}","datetime":1563528642,"status":null,"version":0},"state":{"value":"ok.normal","datetime":1558424417,"status":null,"version":0},"script":{"value":"# имя: 'State Event 1'\r\n# описание: трансляция состояний в события\r\n# тип триггера: 'EgsObjectUpdated'\r\n# создан: 2019.05.20 11.38.49, Сельченков Н.Ю.\r\n# изменен: '2019.07.19 13.43.42', Сельченков Н.Ю.\r\n# подробности: https://redmine.integra-s.com:11000/projects/eilyacuario/wiki/State_Event_1\r\n\r\nuse Newtonsoft.Json.Linq.JToken  as JToken\r\nuse Newtonsoft.Json.Linq.JObject as JObject\r\nuse Newtonsoft.Json.Linq.JArray  as JArray\r\nuse Newtonsoft.Json.JsonConvert  as JsonConvert  from Newtonsoft.Json\r\nuse acuario2.types.BaseObject    as BaseObject   from acuario2.types\r\nuse acuario2.client.StateEvent   as StateEvent   from acuario2.types\r\nuse acuario2.client.Protocol     as Protocol     from acuario2.client\r\nuse WampSharp.V2.IWampChannel    as IWampChannel from WampSharp\r\n\r\nuse System.Func(Guid, IWampChannel) as GetWampChannelProc\r\n\r\nuse typedef\r\n`\r\n    <root>\r\n        <param name=\"table\" />\r\n    </root>\r\n` as Settings\r\n\r\nconst settings = Settings(trigger.settings)\r\nconst table    = JsonConvert.DeserializeObject(settings.table, JObject) as JObject\r\n\r\nconst like_item(item as Item, key as string) = \r\n    if '-' in key then string(item.Id) is key \r\n                  else key in item.Types\r\nend\r\n\r\nconst get_state_masks(value as JToken) = \r\n    if value is JArray arr then from arr select string(it) to array\r\n                           else new [ string(value) ]\r\nend\r\n                  \r\nconst like_state(state as string, value as JToken) = from get_state_masks(value) any state like it\r\n                           \r\nconst get_type(typename as string) = Type.GetType(\"acuario2.types.\"..typename..\",acuario2.types\")\r\n                           \r\nconst check_state(type as Type, value as JToken) = \r\n    let state_typename = type.GetProperty(\"state\")?.PropertyType?.Name\r\n    if state_typename is null then error \"parameter state not found in \"..type\r\n    let state_type = get_type(state_typename)\r\n    if state_type is null then error \"type \"..state_typename..\" not found\"\r\n    let state_names  = Enum.GetNames(state_type) \r\n    let state_masks  = get_state_masks(value) \r\n    let valid_mask(mask as string) = from state_names any it like mask\r\n    let invalid_mask = from state_masks where it isnt valid_mask try first\r\n    if (invalid_mask isnt null) then error \"invalid state mask \"..invalid_mask\r\nend\r\n                           \r\nconst check_entry(key as string, value as JToken) =\r\n    if '-' in key then   \r\n        let item = graph[Guid(key)]\r\n        if item is null then error \"item \"..key..\" not found\"\r\n        check_state(item.GetType(), value)\r\n    else \r\n        let type = get_type(key)\r\n        if type is null then error \"type \"..key..\" not found\"\r\n        check_state(type, value)\r\n    end\r\nend\r\n                           \r\nlet emit_event(item as Item) = \r\n    let event      = StateEvent()\r\n    event.owner    = string(item.Id)\r\n    event.server   = string(item.ServerId)\r\n    event.position = if item is BaseObject obj then obj.position\r\n    let state      = item[\"state\"]\r\n    event.state    = state.Text?.Replace?('_', '.')\r\n    event.datetime = state.DateTime\r\n    event.version  = item.Version\r\n    event.itemtype = item.GetType().Name\r\n    event.name     = if item is BaseObject obj then obj.name\r\n    eval print typeof item.ServerId\r\n    let rpcCatalog = trigger.Module.GetWampChannel(item.ServerId ?? Guid.Empty).RealmProxy.RpcCatalog\r\n    let request    = event.ExportCreate(Guid(event.server))\r\n    Protocol.Put(rpcCatalog, request)\r\nend\r\n                           \r\n######################################\r\n\r\neval from table.Properties() do check_entry(Name, Value) now\r\n\r\nif \"state\" in changes then\r\n    if @object is Item item then \r\n        if from table.Properties() any (item is like_item Name) and (item[\"state\"].Text is like_state Value) then\r\n            emit_event(item)\r\n","datetime":1563529422,"status":null,"version":0},"name":{"value":"State Event 1","datetime":1558337827,"status":null,"version":0}},"entity":"item","operation":"create"}]