Exemple #1
0
        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();
        }
Exemple #2
0
        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);
                }
            };
        }
Exemple #3
0
 public ObservablePlaylistProvider(IMQTTSettings settings)
     : base(settings)
 {
     _songs = new ObservableCollection <Song>();
 }
Exemple #4
0
 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)
 {
 }
Exemple #6
0
 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;
        }