using System; using System.Collections.Generic; using System.Linq; using FireSharp.Interfaces; using FireSharp.Config; using FireSharp; using Newtonsoft.Json; using System.Configuration; using Herse.Models; namespace KaraokePlayer.Classes { public class FirebaseController { private IFirebaseConfig config = new FirebaseConfig { AuthSecret = ConfigurationManager.AppSettings["Firebase.Secret"], BasePath = ConfigurationManager.AppSettings["Firebase.Path"] }; private PlayerState _state = PlayerState.playing; private IFirebaseClient _client; private ControllerStateChangedEventHandler _stateChanged; private ControllerSongChangedEventHandler _songChanged; private string StatePath { get { return string.Format("controllers/{0}/state/", this.Id); } } private string CurrentSongPath { get { return string.Format("controllers/{0}/queue/0/", this.Id); } } public string Id { get; set; } public Song CurrentSong { get; set; } public void SetState(PlayerState state) { _state = state; _client.Set(StatePath, "playing"); } public FirebaseController(string clientId, ControllerStateChangedEventHandler stateChanged, ControllerSongChangedEventHandler songChanged) { Id = clientId; _stateChanged = stateChanged; _songChanged = songChanged; _client = new FirebaseClient(config); SetupListener(); } private void SetupListener() { _client.OnAsync(CurrentSongPath, added: (s, args, obj) => { Console.WriteLine("added " + args.Path + " " + args.Data); CurrentSongDidChange(); }, removed: (s, args, obj) => { //TODO: the current song was removed from the queue } ); _client.OnAsync(StatePath, added: (s, args, obj) => { // do we need this? don't think so }, changed: (s, args, obj) => { Console.WriteLine("state changed " + args.Data); PlayerState newstate = (PlayerState)Enum.Parse(typeof(PlayerState), args.Data); StateDidChange(newstate); }, removed: null ); } private void CurrentSongDidChange() { var response = _client.Get(CurrentSongPath); var item = response.ResultAs(); if (item == null) return; if (CurrentSong == null || CurrentSong.Path != item.Song.Path) { CurrentSong = item.Song; _songChanged(new ControllerSongChangedEventArgs(item.Song)); } } private void StateDidChange(PlayerState newstate) { if (newstate == _state) return; _state = newstate; _stateChanged(new ControllerStateChangedEventArgs(newstate)); } } }