using System; using System.Collections.Generic; using System.Device.Location; using System.Diagnostics; using System.Linq; using System.Threading; using System.Windows.Controls; using MahApps.Tumblr.Models; using MahTweets.Core; using MahTweets.Core.Extensions; using MahTweets.Core.Extensions.MahTweets.Core.Extensions; using MahTweets.Core.Interfaces; using MahTweets.Core.Models; using MahTweets.Core.Repositories; using MahTweets.Core.UpdateTypes; using MahTweets.Extensions.Tumblr.Models; using MahTweets.Extensions.Tumblr.ViewModels; using MahTweets.Extensions.Tumblr.Views; namespace MahTweets.Extensions.Tumblr { public class Tumblr : IMicroblog { private readonly Func _setupViewModelFactory; private List _supportedTypes; private MahApps.Tumblr.Tumblr _tumblr; public Tumblr( IStatusService statusService, ContactRepository contactRepository, Func setupViewModelFactory) { _setupViewModelFactory = setupViewModelFactory; StatusUpdateManager = statusService; Contacts = contactRepository; } private IStatusService StatusUpdateManager { get; set; } private ContactRepository Contacts { get; set; } public static Action OnSuccess { get; set; } public static Action OnFailure { get; set; } #region IMicroblog Members public bool IsRefreshing { get; private set; } public void Connect() { _tumblr = new MahApps.Tumblr.Tumblr(Credentials.Username, Credentials.Password); } public void Disconnect() { } public void Refresh(bool isRequired) { try { IsRefreshing = true; var manualResetEvent = new ManualResetEvent(false); _tumblr.Read.Dashboard((r, res, obj) => { var x = (MahApps.Tumblr.Models.Tumblr) obj; if (x != null) { var updates = new List(); foreach (Post tumbl in x.Posts.Posts) { Contact c = Contacts.FetchOrCreate(tumbl.Tumblelog.Name); c.ID = tumbl.Tumblelog.Name; c.ImageUrl = new Uri(tumbl.Tumblelog.Avatar40); var update = new TumblrStatus { ID = tumbl.ID, Contact = c, Time = tumbl.Time, Text = tumbl.Body, }; switch (tumbl.Type) { case "photo": update.Image = new Uri(tumbl.PhotoUrl.First()); update.Text = tumbl.PhotoCaption.StripHtml(); break; } update.Types.Add(new NormalUpdate()); update.AddParent(this); StatusUpdateManager.OnNext(update); } } manualResetEvent.Set(); }); manualResetEvent.WaitOne(); IsRefreshing = false; } catch (Exception ex) { //TODO Write error handling Debug.WriteLine(ex); } } public Contact Owner { get; set; } public void NewStatusUpdate(string text) { } public void NewStatusUpdate(string text, string id) { } public void NewStatusUpdate(string text, string id, GeoCoordinate location) { } public bool ReadOnly { get { return true; } } public IList SupportedTypes { get { if (_supportedTypes == null) { _supportedTypes = new List(); _supportedTypes.AddUpdate(this); } return _supportedTypes; } } public Credential Credentials { get; set; } public string Name { get { return "Tumblr"; } } public string Protocol { get { return "tumblr"; } } public Action ShowDialog { get; set; } public Uri DarkIcon { get { return new Uri("/MahTweets.Extensions.Tumblr;component/Resources/tumblr_light.png", UriKind.RelativeOrAbsolute); } } public Uri LightIcon { get { return new Uri("/MahTweets.Extensions.Tumblr;component/Resources/tumblr_dark.png", UriKind.RelativeOrAbsolute); } } public void Setup(Action onSuccess, Action onError) { OnSuccess = onSuccess; OnFailure = onError; var setup = new TumblrSetupView { DataContext = _setupViewModelFactory() }; ShowDialog(setup); } public string OwnerName { get { return Credentials.AccountName; } } #endregion } }