/// <summary> /// Initializes Twitter API /// </summary> private static void InitializeTwitterApi() { if ((!string.IsNullOrEmpty(_twitter.oAuthTwitter.Token) && !string.IsNullOrEmpty(_twitter.oAuthTwitter.TokenSecret))) { _twitter.SetAllowedFriends(CommonFunctions.GetSetting("Service_Twitter_Friends")); } }
/// <summary> /// Updates status to XML file /// </summary> /// <param name="newStatus"></param> public void UpdateXml(string[] newStatus) { if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Xml"))) { if (string.IsNullOrEmpty(newStatus[0]) && bool.Parse(CommonFunctions.GetSetting("Service_Xml_ClearWhenNoMedia"))) { WriteXmlFile(new string[] { "", "", "", "0" }); } else { try { WriteXmlFile(newStatus); } catch (Exception e) { ShowDialog("Unable to save status XML file. " + e.Message, false, 2, DialogButtons.Ok); } finally { _previousStatus = newStatus[0]; MyAddIn.StatusHasBeenChanged = true; } } } }
/// <summary> /// Shows next Twitter status /// </summary> private void ShowNextTwitterStatus() { string[] twitterStatusString = _twitter.GetNextTwitterStatus(); if (twitterStatusString != null) { int timeToShow = 5; // Show long tweets longer time if (twitterStatusString[1].Length > 100) { timeToShow = 10; } // Show suspend tweets button if configured if (bool.Parse(CommonFunctions.GetSetting("Service_Twitter_EnableSuspend"))) { var buttons = new string[] { "OK", "Suspend" }; DialogClosedCallback dcc = new DialogClosedCallback(TwitterDialogClosed); _host.MediaCenterEnvironment.Dialog(twitterStatusString[1], twitterStatusString[0] + " says", buttons, timeToShow, false, "", dcc); } else { _host.MediaCenterEnvironment.Dialog(twitterStatusString[1], twitterStatusString[0] + " says", DialogButtons.Ok, timeToShow, false); } } }
/// <summary> /// Initializes Twitter, including showing login screen /// </summary> private void InitializeTwitter() { if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Twitter")) || bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_TwitterFriends"))) { _twitter = new TwitterAPI(); if (string.IsNullOrEmpty(CommonFunctions.GetSetting("Twitter_AccessToken")) || string.IsNullOrEmpty(CommonFunctions.GetSetting("Twitter_AccessTokenSecret"))) { // Show Twitter login screen TwitterLoginScreen(); } else { if (!InitializeTwitterApi(CommonFunctions.GetSetting("Twitter_AccessToken"), CommonFunctions.GetSetting("Twitter_AccessTokenSecret"))) { // Show Twitter login screen TwitterLoginScreen(); } } // Get latest friend update status id if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_TwitterFriends")) && !disableTwitterNotifications) { if (!_twitter.UpdateLatestTwitterStatusId()) { _host.MediaCenterEnvironment.Dialog("Error getting latest Twitter status ID, disabling Twitter friend status update notifications", AppName, DialogButtons.Ok, 10, true); disableTwitterNotifications = true; } } } }
public void Uninitialize() { if (bool.Parse(CommonFunctions.GetSetting("Service_Xml_ClearWhenNoMedia"))) { _application.UpdateXml(new string[] { "", "", "", "0" }); } _mediaState.Dispose(); }
/// <summary> /// Sets the time when to re-enable showing Twitter updates /// </summary> private void InitTwitterSuspend() { // Immdiately clear all queued tweets _twitter.ClearStatusQueue(); double suspendTime = 0; double.TryParse(CommonFunctions.GetSetting("Service_Twitter_SuspendTime"), out suspendTime); _twitterSuspendTime = DateTime.Now.AddMinutes(suspendTime); }
private static void WriteXmlFile(string[] newStatus) { XmlDocument xmlDoc = new XmlDocument(); StringBuilder xml = new StringBuilder("<status><value>"); xml.Append(newStatus[0]); xml.Append("</value><media>"); xml.Append(newStatus[1]); xml.Append("</media><mediatype>"); xml.Append(newStatus[2]); xml.Append("</mediatype></status>"); xmlDoc.LoadXml(xml.ToString()); xmlDoc.Save(CommonFunctions.GetSetting("Service_Xml_File")); }
/// <summary> /// Determines whether service is enabled based on registry start and end hour of day. /// </summary> /// <param name="key">Registry key containing time value when the specific service is enabled.</param> /// <returns>True if enabled</returns> private bool EventTimeEnabled(string key) { bool retVal = false; try { string timeSpan = CommonFunctions.GetSetting(key); if (string.IsNullOrEmpty(timeSpan)) { retVal = true; } else if (timeSpan.Contains("-")) { string[] timeArr = timeSpan.Split('-'); int start, end; if (int.TryParse(timeArr[0], out start) && int.TryParse(timeArr[1], out end)) { int hour = DateTime.Now.Hour; if (end < start) { if (hour >= start || hour < end) { retVal = true; } } else { if (hour >= start && hour < end) { retVal = true; } } } } } catch (Exception) { _host.MediaCenterEnvironment.Dialog("Error occurred in Event Time processing, please verify " + key, AppName, DialogButtons.Ok, 5, false); } return(retVal); }
/// <summary> /// Initialized Facebook session /// </summary> private void InitializeFacebook() { if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Facebook"))) { _fbApi = new FacebookAPI { IsDesktopApplication = true, ApplicationKey = _fbAppId, }; // If persistent session key was found, use it, else login if (!string.IsNullOrEmpty(_fbAccessToken = CommonFunctions.GetSetting("Facebook_AccessToken")) && !_fbAccessToken.Equals("false")) { _fbApi.AccessToken = _fbAccessToken; try { string uid = _fbApi.GetLoggedInUser(); // If uid was not found, session is invalid if (string.IsNullOrEmpty(uid)) { _fbApi.AccessToken = ""; CommonFunctions.SetSetting("Facebook_AccessToken", ""); FacebookLogin(false); } } catch (Exception) { _fbApi.AccessToken = ""; CommonFunctions.SetSetting("Facebook_AccessToken", ""); FacebookLogin(false); } } else { FacebookLogin(false); } } }
/// <summary> /// Updates Twitter status /// </summary> /// <param name="newStatus"></param> private void UpdateTwitter(string[] newStatus) { if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Twitter")) && !MyAddIn.disableTwitterNotifications) { try { bool updateConfirmed = true; // Confirm Twitter update from the user if (bool.Parse(CommonFunctions.GetSetting("ConfirmUpdate_Twitter"))) { DialogResult confirmUpdateResult = ShowDialog("Publish to Twitter: '" + newStatus[0] + "'?", true, 10, DialogButtons.Yes | DialogButtons.No); if (confirmUpdateResult == DialogResult.No || confirmUpdateResult == DialogResult.Timeout) { updateConfirmed = false; _previousStatus = newStatus[0]; } } if (updateConfirmed) { if (!MyAddIn.TwitterApi.SetStatus(newStatus[0])) { ShowDialog("Unable to publish to Twitter.", false, 2, DialogButtons.Ok); } } } catch (Exception e) { ShowDialog("Unable to publish to Twitter. " + e.Message, false, 2, DialogButtons.Ok); } finally { _previousStatus = newStatus[0]; MyAddIn.StatusHasBeenChanged = true; } } }
/// <summary> /// Updates Facebook status /// </summary> /// <param name="newStatus"></param> private void UpdateFacebook(string[] newStatus) { if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Facebook"))) { if (MyAddIn.FbApi != null && !string.IsNullOrEmpty(MyAddIn.FbApi.AccessToken)) { try { bool updateConfirmed = true; // Confirm Facebook update from the user if (bool.Parse(CommonFunctions.GetSetting("ConfirmUpdate_Facebook"))) { DialogResult confirmUpdateResult = ShowDialog("Publish to Facebook: '" + newStatus[0] + "'?", true, 10, DialogButtons.Yes | DialogButtons.No); // If update isn't confirmed or dialog times out, do not prompt for confirmation again if (confirmUpdateResult == DialogResult.No || confirmUpdateResult == DialogResult.Timeout) { updateConfirmed = false; _previousStatus = newStatus[0]; } } if (updateConfirmed) { try { attachment attachment = null; bool streamEnabled = bool.Parse(CommonFunctions.GetSetting("Service_Facebook_StreamEnabled")); bool statusEnabled = bool.Parse(CommonFunctions.GetSetting("Service_Facebook_StatusEnabled")); if (streamEnabled) { string amazonLocaleApiUrl = CommonFunctions.GetSetting("Service_All_AmazonLocaleUrl"); // If Amazon queries are enabled for current media if (!string.IsNullOrEmpty(newStatus[1])) { string[] amazonDetails = { "", "", "", "", "", "", "" }; // Title, DetailUrl, ImageUrl, Error, AverageRating, Artist amazonDetails = Query.SearchItems(newStatus[1], newStatus[2], amazonDetails, amazonLocaleApiUrl); // If ASIN exists, continue search if (!string.IsNullOrEmpty(amazonDetails[4])) { amazonDetails = Query.LookupItem(amazonDetails, amazonLocaleApiUrl); if (string.IsNullOrEmpty(amazonDetails[3])) { attachment = new attachment(); // For videos/tv, show video/tv title as a link if (newStatus[2].Equals("Video") && newStatus[2].StartsWith("TV")) { attachment.caption = ""; attachment.name = amazonDetails[0]; // Artist } else { attachment.caption = amazonDetails[0]; // Album attachment.name = amazonDetails[6]; // Artist } attachment.href = amazonDetails[1]; attachment.description = null; attachment.properties = new attachment_property() { category = null, /*new attachment_category() * { * href = "", * text = "" * }*/ ratings = !string.IsNullOrEmpty(amazonDetails[5]) ? amazonDetails[5] + " stars" : null }; attachment.media = new List <attachment_media>() { new attachment_media_image() { src = amazonDetails[2], href = amazonDetails[1] } }; } } else { attachment = null; } } else { attachment = null; } // Finally post to user's Wall and News feed if (!string.IsNullOrEmpty(MyAddIn.FbApi.StreamPublish(newStatus[0], attachment, null, "", 0))) { _previousStatus = newStatus[0]; MyAddIn.StatusHasBeenChanged = true; } } if (statusEnabled) { if (string.IsNullOrEmpty(MyAddIn.FbApi.SetStatus(newStatus[0], true))) { _previousStatus = newStatus[0]; MyAddIn.StatusHasBeenChanged = true; } } } catch (Facebook.Exceptions.FacebookSigningException) { MyAddIn.FbApi.AccessToken = ""; CommonFunctions.SetSetting("Facebook_AccessToken", ""); ShowDialog("Facebook session is invalid, opening login screen...", false, 2, DialogButtons.Ok); } catch (Facebook.Exceptions.FacebookTimeoutException) { MyAddIn.FbApi.AccessToken = ""; CommonFunctions.SetSetting("Facebook_AccessToken", ""); ShowDialog("Facebook session is invalid, opening login screen...", false, 2, DialogButtons.Ok); } } } catch (Exception e) { ShowDialog("Unable to publish to Facebook." + e.Message, false, 2, DialogButtons.Ok); } } } }
/// <summary> /// Constructs the current media string that is set as status /// </summary> /// <returns></returns> private string[] GetMediaStatus() { string[] status = { "", "", "", "0" }; string exclusion = ""; #region TV Recording if (MyAddIn.MediaState.TVRecording.Active) { string tvRecording = MyAddIn.MediaState.TVRecording.MediaName; if (!string.IsNullOrEmpty(tvRecording) && !_previousMediaName[MediaTypes.TVRecording].Equals(tvRecording) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_RecordingTV")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_RecordingTV_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(tvRecording, exclusion)))) { status[0] = CommonFunctions.GetSetting("EventsConfig_RecordingTV_StatusString").Replace("%TITLE%", tvRecording); _previousMediaName[MediaTypes.TVRecording] = tvRecording; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_RecordingTV_QueryAmazon"))) { status[1] = tvRecording; } status[2] = "Recording TV"; status[3] = "1"; return(status); } } #endregion #region TV if (MyAddIn.MediaState.TV.Active) { string tv = MyAddIn.MediaState.TV.MediaName; if (!string.IsNullOrEmpty(tv) && !_previousMediaName[MediaTypes.TV].Equals(tv) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_TV")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_TV_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(tv, exclusion)))) { status[0] = CommonFunctions.GetSetting("EventsConfig_TV_StatusString").Replace("%TITLE%", tv); _previousMediaName[MediaTypes.TV] = tv; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_TV_QueryAmazon"))) { status[1] = tv; } status[2] = "Live TV"; status[3] = "1"; return(status); } } #endregion #region Recorded TV if (MyAddIn.MediaState.TVRecorded.Active) { string tvRecorded = MyAddIn.MediaState.TVRecorded.MediaName; if (!string.IsNullOrEmpty(tvRecorded) && !_previousMediaName[MediaTypes.TVRecorded].Equals(tvRecorded) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_RecordedTV")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_RecordedTV_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(tvRecorded, exclusion)))) { status[0] = CommonFunctions.GetSetting("EventsConfig_RecordedTV_StatusString").Replace("%TITLE%", tvRecorded); _previousMediaName[MediaTypes.TVRecorded] = tvRecorded; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_RecordedTV_QueryAmazon"))) { status[1] = tvRecorded; } status[2] = "Recorded TV"; status[3] = "1"; return(status); } } #endregion #region Video if (MyAddIn.MediaState.Video.Active) { string video = MyAddIn.MediaState.Video.MediaName; if (!string.IsNullOrEmpty(video) && !_previousMediaName[MediaTypes.Video].Equals(video) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Video")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_Video_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(video, exclusion) ))) { status[3] = "1"; } status[0] = CommonFunctions.GetSetting("EventsConfig_Video_StatusString").Replace("%TITLE%", video); _previousMediaName[MediaTypes.Video] = video; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_Video_QueryAmazon"))) { status[1] = video; } status[2] = "DVD"; return(status); } #endregion #region Pictures if (MyAddIn.MediaState.Pictures.Active) { string picture = MyAddIn.MediaState.Pictures.CurrentPicture; if (!string.IsNullOrEmpty(picture) && !_previousMediaName[MediaTypes.Pictures].Equals(picture) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Pictures"))) { status[0] = CommonFunctions.GetSetting("EventsConfig_Pictures_StatusString").Replace("%TITLE%", picture); _previousMediaName[MediaTypes.Pictures] = picture; status[2] = "Pictures"; status[3] = "1"; return(status); } } #endregion #region DVD if (MyAddIn.MediaState.DVD.Active) { string dvd = MyAddIn.MediaState.DVD.MediaName; if (!string.IsNullOrEmpty(dvd) && !_previousMediaName[MediaTypes.DVD].Equals(dvd) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_DVD")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_DVD_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(dvd, exclusion)))) { status[0] = CommonFunctions.GetSetting("EventsConfig_DVD_StatusString").Replace("%TITLE%", dvd); _previousMediaName[MediaTypes.DVD] = dvd; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_DVD_QueryAmazon"))) { status[1] = dvd; } status[2] = "DVD"; status[3] = "1"; return(status); } } #endregion #region Music if (MyAddIn.MediaState.Music.Active) { string music = MyAddIn.MediaState.Music.ArtistName + " - "; // Determine whether to append track or album name if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_Music_AlbumMode"))) { music += MyAddIn.MediaState.Music.MediaName; } else { music += MyAddIn.MediaState.Music.TrackName; } if (!music.Equals(" - ") && !_previousMediaName[MediaTypes.Music].Equals(music) && bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Music")) && (string.IsNullOrEmpty(exclusion = CommonFunctions.GetSetting("Exclusion_Music_RegExp")) || (!string.IsNullOrEmpty(exclusion) && !Regex.IsMatch(music, exclusion)))) { status[0] = CommonFunctions.GetSetting("EventsConfig_Music_StatusString").Replace("%TITLE%", music); _previousMediaName[MediaTypes.Music] = music; if (bool.Parse(CommonFunctions.GetSetting("EventsConfig_Music_QueryAmazon"))) { // Always use media name in music search status[1] = MyAddIn.MediaState.Music.ArtistName + "|" + MyAddIn.MediaState.Music.MediaName; } status[2] = "Music"; status[3] = "1"; return(status); } } #endregion return(status); }
public void Launch(AddInHost host) { _host = host; // Do not run this on extenders as extenders don't support MSAS if (_host.MediaCenterEnvironment.Capabilities.ContainsKey("Console")) { try { // Initialize FB session InitializeFacebook(); // Initialize Twitter session InitializeTwitter(); // Connect must be done here and not in Initialize, else the events are not launched (if using MSASEventHandler) // or _mediaState will always be null. _mediaState.Connect(); _application = new Application(_host); int.TryParse(CommonFunctions.GetSetting("PollingInterval"), out _pollingInterval); int twitterStatusUpdateQueryCounter = 0; // Used to ensure that Twitter friend updates are not queried more that 100 times per hour, which is the limit int twitterStatusUpdateQueryCounterLimit = 3600000 / int.Parse(CommonFunctions.GetSetting("Service_Twitter_Friends_TimesPerHour")) / _pollingInterval; while (true) { Sleep(_pollingInterval); bool runApp = false; // DoEvents must be done here, else _mediaState doesn't contain current states System.Windows.Forms.Application.DoEvents(); if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Facebook")) && EventTimeEnabled("Service_Facebook_TimeEnabled")) { if (_fbApi != null && !string.IsNullOrEmpty(_fbApi.AccessToken)) { runApp = true; } } if ((bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Xml")) && EventTimeEnabled("Service_Xml_TimeEnabled")) || (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_Twitter")) && EventTimeEnabled("Service_Twitter_TimeEnabled"))) { // If event is enabled and also allowed by time settings runApp = true; } if (runApp) { runApp = false; _application.Run(); } if (!disableTwitterNotifications) { // For showing Twitter updates of friends if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_TwitterFriends")) && twitterStatusUpdateQueryCounter++ > twitterStatusUpdateQueryCounterLimit) { twitterStatusUpdateQueryCounter = 0; // Check if Twitter suspend time has passed if (DateTime.Now.CompareTo(_twitterSuspendTime) < 0) // returns greater than zero if current time is past suspend end time { // Twitter update is still suspended, just get latest ID in order not to spam user with queued tweets after suspend period ends _twitter.UpdateLatestTwitterStatusId(); } else if (!_twitter.UpdateLatestTwitterStatusChanges()) { _host.MediaCenterEnvironment.Dialog("Error getting Twitter updates, retrying later.", AppName, DialogButtons.Ok, 5, true); } } if (bool.Parse(CommonFunctions.GetSetting("EventsEnabled_Service_TwitterFriends"))) { ShowNextTwitterStatus(); } } } } catch (Exception exc) { _host.MediaCenterEnvironment.Dialog("Unable to launch, quitting. " + exc.ToString(), AppName, DialogButtons.Ok, 0, true); } } }
public void Initialize(Dictionary <string, object> appInfo, Dictionary <string, object> entryPointInfo) { _mediaState = new MediaState(); DebugEnabled = bool.Parse(CommonFunctions.GetSetting("Debug")); }