using Model.Enum; using Model.Notice; using MQTTnet; using MQTTnet.Protocol; using MQTTnet.Server; using ZmajService.Common; using ZmajService.Service.BatchJob; using ZmajService.Service.Mqtt; using ZmajService.User; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TF.Common.Json; using TF.Common.Tools; using TF.Logger; namespace ZmajService.Service { class PublishSupport { #region Static public delegate Task MessageSendHanlder(MqttApplicationMessage message); public static event MessageSendHanlder OnPublishEvent; public static async Task Publish(MessageModel model) { string topic; switch (model.MessageType) { case MessageType.Notice: case MessageType.Tips: topic = $"/sxaj/{model.ReceiveUserId}"; break; case MessageType.Public: topic = $"/sxaj/public"; break; default: topic = $"/sxaj/{model.ReceiveUserId}"; break; } string payload = JsonHelper.SerializeObject(model); return await MessagePublish(topic, payload); } private static async Task MessagePublish(string topic, string payload) { if (string.IsNullOrEmpty(topic) || string.IsNullOrEmpty(payload)) { return false; } if (!MqttService.IsRunning) { return false; } try { var message = new MqttApplicationMessageBuilder() .WithTopic(topic) .WithPayload(payload) .Build(); await OnPublishEvent?.Invoke(message); Log.Info($"Publish({topic}):{payload}"); return true; } catch (Exception ex) { Log.Error($"Publish payload with topic({topic}) failed. {ex.Message}", ex); return false; } } #endregion } }