public ChatProvider(IMQTTSettings settings, Channel channel) : base(settings.Broker, settings.Port, settings.Username, settings.Password) { Chats = new ObservableCollection <ChatMessage>(); // ChannelHandler chats On["/" + channel.Name + "/chat"] = _ => { LogTo.Trace("[{0}]: {1}", channel.Name, (string)_.Message); var msg = JsonConvert.DeserializeObject <ChatMessage>(_.Message); Chats.Add(msg); }; Run(); }
public Server(IMQTTSettings settings, IChannelHandlerFactory chf, ServerSpotifyAuth spot, RedisProvider redis) : base(settings.Broker, settings.Port, settings.Username, settings.Password) { _spot = spot; _redisconnection = redis.redis; _redis = _redisconnection.GetDatabase(); LogTo.Trace("Initializing routes"); ////// // User messages ////// /// // Handle user-channel interaction On["/user/{username}/{channel}/songs/{songid}"] = msg => { switch ((string)msg.Message) { case "vote": AddVote(msg.channel, msg.songid, msg.username); break; case "unvote": RemoveVote(msg.channel, msg.songid, msg.username); break; case "report": ReportSong(msg.channel, msg.songid, msg.username); break; case "remove": RemoveSong(msg.channel, msg.songid, msg.username); break; case "block": BlockSong(msg.channel, msg.songid, msg.username); break; default: LogTo.Warn("[{0}] Invalid command: {1}: {2}, by {3}", (string)msg.channel, (string)msg.Topic, (string)msg.Message, (string)msg.username); break; } }; // Handle channel registration On["/user/{username}/register/{channel}"] = _ => { // TODO Separate channel name from ID Channel channel = JsonConvert.DeserializeObject <Channel>(_.Message); if (channel == null || string.IsNullOrWhiteSpace(channel.Name)) { LogTo.Warn("Rejected invalid channel JSON from {0} for channel {1}: {2}", (string)_.username, (string)_.channel, (string)_.Message); return; } LogTo.Info("[{0}] {1} sent channel data: {2}", (string)_.channel, (string)_.username, (string)_.Message); if (!_redis.KeyExists(GetChannelNameID(_.channel))) { // Channel doesn't exist yet LogTo.Info("[{0}] Setting up new channel for {1}", (string)_.channel, (string)_.username); _redis.StringSet(GetChannelNameID(_.channel), channel.Name); _redis.StringSet(GetChannelDescriptionID(_.channel), channel.Description); _redis.SetAdd(GetChannelModeratorID(_.channel), _.username); } else { // Channel exists if (!_redis.SetContains(GetChannelModeratorID(_.channel), _.username)) { LogTo.Error("[{0}] Error: User {1} not a moderator of channel", (string)_.channel, (string)_.username); return; } LogTo.Info("[{0}] changing existing channel for {1}", (string)_.channel, (string)_.username); _redis.StringSet(GetChannelNameID(_.channel), channel.Name); _redis.StringSet(GetChannelDescriptionID(_.channel), channel.Description); } Publish(string.Format("/{0}/info", _.channel), _.Message, true); }; // Handle user chat messages On["/user/{username}/{channel}/chat"] = _ => { LogTo.Trace("{0}->{1}: {2}", (string)_.username, (string)_.channel, (string)_.Message); // TODO [LOW] Allow moderators to mute users if (channels.ContainsKey(_.channel)) { var topic = string.Format("/{0}/chat", _.channel); var message = new ChatMessage { message = _.Message, username = _.username, time = Time.Timestamp() }; var messageJson = JsonConvert.SerializeObject(message); Publish(topic, messageJson); HipchatSender.SendNotification(_.channel, string.Format("{0}: {1}", message.username, message.message), RoomColors.Gray); } else { LogTo.Debug("Chat was for invalid channel"); } }; ////// // Channel messages ////// // TODO: This should be separate from above // Handle channel info On["/{channel}/info"] = _ => { LogTo.Info("[{0}] Got info: {1}", (string)_.channel, (string)_.Message); Channel channel = JsonConvert.DeserializeObject <Channel>(_.Message); if (!channels.ContainsKey(_.channel)) { ChannelHandler channelHandler = chf.CreateChannelHandler(_.channel); channelHandler.Subscribe(); channels[_.channel] = channelHandler; StartChannelScheduler(channelHandler); } }; }
public ObservablePlaylistProvider(IMQTTSettings settings) : base(settings) { _songs = new ObservableCollection <Song>(); }
public SortedPlaylistProvider(IMQTTSettings settings, RedisProvider redis) : base(settings.Broker, settings.Port, settings.Username, settings.Password) { _redis = redis.redis.GetDatabase(); Songs = new List <Song>(); }
public PlaylistProviderBase(IMQTTSettings settings) : base(settings.Broker, settings.Port, settings.Username, settings.Password) { }
public AuthPair(IMQTTSettings connectionSettings, ISettingsProvider settings) { ConnectionSettings = connectionSettings; Settings = settings; }
public MQTTService(IMQTTSettings mqttSettings, IMQTTProcessingService mqttProcessingService) { _mqttProcessingService = mqttProcessingService; // no mqtt messaging if no MQTT broker if (string.IsNullOrEmpty(Program.mqttSettings.Host)) { return; } // when single tenant case, only 1 MQTT client needed for (var t = 0; t < Program.Tenants.Count; t++) { var mqttTopic = Program.mqttSettings.TopicTemplate.Replace("{TenantId}", Program.Tenants[t].TenantId); var mqttClient = _factory.CreateMqttClient(); var mqttClientID = Program.InstanceConfig.ServerInstanceID + ":" + Program.Tenants[t].TenantId; var myMqttClient = new MyMQTTClient() { TenantId = Program.Tenants[t].TenantId, mqttTopic = mqttTopic, mqttClient = mqttClient, mqttClientId = mqttClientID }; if (string.IsNullOrEmpty(Program.mqttSettings.User)) { _mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(Program.mqttSettings.Host, Program.mqttSettings.Port) .WithClientId(myMqttClient.mqttClientId) .Build(); } else { _mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(Program.mqttSettings.Host, Program.mqttSettings.Port) .WithCredentials(Program.mqttSettings.User, Program.mqttSettings.Password) .WithClientId(myMqttClient.mqttClientId) .Build(); } mqttClient.UseDisconnectedHandler(async disconnected => { UseDisconnectedHandler(mqttClient, disconnected); }); mqttClient.UseConnectedHandler(async conn => { UseConnectedHandler(mqttClient, myMqttClient.mqttTopic, conn); }); mqttClient.UseApplicationMessageReceivedHandler(async message => { UseApplicationMessageReceivedHandler(message); }); mqttClient.ConnectAsync(_mqttClientOptions); _mqttClients.Add(myMqttClient); } // start broadcast timer _broadcastPeerTimer = new System.Timers.Timer(Math.Min(Program.InstanceConfig.PeerEvictionInSecs - Program.InstanceConfig.PeerHeartbeatBeforeEvictionInSecs, Program.InstanceConfig.PeerMinHeartbeatInSecs) * 1000); _broadcastPeerTimer.AutoReset = true; _broadcastPeerTimer.Enabled = true; _broadcastPeerTimer.Elapsed += OnBroadcastTimedEvent; }