public async Task ExecuteFlagFriendCommand (long friendId, string name) { if (IsBusy) return; using (BusyContext ()) { try { if (!await RefreshToken ()) return; var userManager = new UserManager (Settings.AccessToken); var flagList = await userManager.GetFlags (); if (flagList.Count == 0) return; LoadingMessage = "Loading..."; App.MessageDialog.SelectOption ("Report Friend For:", flagList.Select (f => f.Description).ToArray (), async (which) => { try { var firstFlag = flagList [which]; await userManager.FlagUser ((int)friendId, firstFlag.Id); RaiseNotification ("User has been flagged for administrative review."); } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Unable to flag, please try again."); } }); } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Unable to flag, please try again."); } } }
public async Task ExecuteLoadFlagsCommand() { if (IsBusy) return; IsBusy = true; try { var userManager = new UserManager(Settings.AccessToken); var flags = await userManager.GetFlags(); //Use linq to sorty our monkeys by name and then group them by the new name sort property var sorted = from flag in flags orderby flag.AlertLevel group flag by flag.AlertLevel.ToString() into flagGroup select new Grouping<string, Flag>(flagGroup.Key, flagGroup); //create a new collection of groups FlagsGrouped = new ObservableCollection<Grouping<string, Flag>>(sorted); OnPropertyChanged("FlagsGrouped"); } catch (Exception ex) { var page = new ContentPage(); page.DisplayAlert("Error", "Unable to load flags.", "OK"); ; } finally { IsBusy = false; } }
private async void ChangeAvatar_OnClick(object sender, RoutedEventArgs e) { var userManager = new UserManager("HhYZWTPIldWkWtlmIcx8CLAfE4jZacU4yPg-kv99yB5n9sP1mokPtwgGelQyjbRWcrrLpp6vAwtS7fDKN68U1fh_--k3XQ-LgKraK6W2IktCjuLkYqkIA7KB5G5Qv8Ym6YhSo7y62Fo9Uz4nzHatm5EFaDRk8odPYmkr9ksGi9sH5PaCI5_HjY6UKb2fNIpjHYqpYiBNkJ1EnWlnYHDK1JJp4fk3RSWp9ohFpuXjNmKtzRTqomF28OuCfUvME_Lf9mLsP0peTQX4_yGMtFPdjYJ0qx0b4vcRBEQos4Q8hHf0vmG2ZPNB6ARKgw5ZVzuKf1zkQOqaQe76e0VwvHrZ8fF9S6leZE0wfknGwDglpGfyx71qqovDZ_tHgXAsp5oCDqOpbVPZwX5FgrHsKZInOsj4tLakCpjiPKQmYOmD74MzVyHj2ExOukpR9utsY4FrLiBh3NOcaeau9U_ZjLkGDIcKVSX8SRbr9SnHms3HvQ6-zfSe_isudmFHNxAcZ_t0IuTwC_WR4J26N0IsusjvgHiAvBXLh_73cvmcxvJfIbw"); var openPicker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; openPicker.FileTypeFilter.Add(".jpg"); openPicker.FileTypeFilter.Add(".jpeg"); openPicker.FileTypeFilter.Add(".png"); openPicker.FileTypeFilter.Add(".gif"); StorageFile file = await openPicker.PickSingleFileAsync(); if (file == null) return; IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read); await userManager.AddCustomAvatar(stream.AsStreamForRead()); }
private async void GetUser_OnClick(object sender, RoutedEventArgs e) { var userManager = new UserManager("HhYZWTPIldWkWtlmIcx8CLAfE4jZacU4yPg-kv99yB5n9sP1mokPtwgGelQyjbRWcrrLpp6vAwtS7fDKN68U1fh_--k3XQ-LgKraK6W2IktCjuLkYqkIA7KB5G5Qv8Ym6YhSo7y62Fo9Uz4nzHatm5EFaDRk8odPYmkr9ksGi9sH5PaCI5_HjY6UKb2fNIpjHYqpYiBNkJ1EnWlnYHDK1JJp4fk3RSWp9ohFpuXjNmKtzRTqomF28OuCfUvME_Lf9mLsP0peTQX4_yGMtFPdjYJ0qx0b4vcRBEQos4Q8hHf0vmG2ZPNB6ARKgw5ZVzuKf1zkQOqaQe76e0VwvHrZ8fF9S6leZE0wfknGwDglpGfyx71qqovDZ_tHgXAsp5oCDqOpbVPZwX5FgrHsKZInOsj4tLakCpjiPKQmYOmD74MzVyHj2ExOukpR9utsY4FrLiBh3NOcaeau9U_ZjLkGDIcKVSX8SRbr9SnHms3HvQ6-zfSe_isudmFHNxAcZ_t0IuTwC_WR4J26N0IsusjvgHiAvBXLh_73cvmcxvJfIbw"); var result = await userManager.GetUser("*****@*****.**"); }
public async Task ExecuteValidatePinCommand () { if (App.FakeSignup) { await App.InitDatabase(); CanProgress = true; OnPropertyChanged ("CanProgress"); return; } if (IsBusy) return; CanProgress = false; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("FinalizeSignup")) { try { App.CryptoService.GenerateKeys (); var pk = Convert.ToBase64String (App.CryptoService.PublicKey); var token = await authenticationService.CreateUserDeviceViaEmail (Settings.Email, Pin, pk, nickName); if (token == null || token.AccessToken == null || token.DeviceId == null) { App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } // Initial "AccessToken" is actually the devices password, and needed to get new tokens Settings.DevicePassword = token.AccessToken; Settings.UserDeviceLoginId = token.DeviceLoginId; Settings.UserDeviceId = token.DeviceId; var finalToken = await authenticationService.Authenticate (Settings.UserDeviceLoginId, Settings.DevicePassword); if (finalToken == null || finalToken.AccessToken == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } Settings.AccessToken = finalToken.AccessToken; var nextTime = DateTime.UtcNow.AddSeconds (finalToken.ExpiresIn).Ticks; Settings.KeyValidUntil = nextTime; //need to store when to refresh var userManager = new UserManager (Settings.AccessToken); var user = await userManager.GetUser (Settings.Email); if (user == null || user.Devices == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Issue in registration, please try again."); return; } Settings.MyId = user.Id; Settings.Avatar = user.Avatar.Location; #pragma warning disable 4014 // This is like "fire and forget" we are not interested in result // also we are not interested in possible exceptions ServiceContainer.Resolve<ConnectionManager> ().TryKeepConnectionAsync (); //we don't need to await it #pragma warning disable restore App.Logger.Track ("PickTheme", new Dictionary<string, string> { { "nickname", Settings.NickName }, { "avatar", user.Avatar.Location }, { "theme", Settings.AppTheme == AppTheme.Blue ? "blue" : "pink" } }); CanProgress = true; } catch (Exception ex) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.Logger.Report (ex); App.MessageDialog.SendToast ("Invalid PIN, please try again"); } } } }
public async Task UploadPhoto(MediaFile file) { bool refreshAvatars = false; LoadingMessage = "Uploading Photo..."; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("UploadPhoto")) { try { if (!await RefreshToken ()) return; var userManager = new UserManager (Settings.AccessToken); var stream = file.GetStream (); var newAvatar = await userManager.AddCustomAvatar (stream); if (newAvatar == null) return; Avatar = newAvatar.Location; Settings.Avatar = newAvatar.Location; Settings.CustomAvatar = newAvatar.Location; Settings.CustomAvatarId = newAvatar.Id; App.Logger.Track ("AvatarUploaded"); OnPropertyChanged (AvatarUrlName); refreshAvatars = true; } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Avatar upload failed. Please try again."); } } } if (refreshAvatars) await ExecuteLoadAvatarsCommand (); }
public async Task ExecuteSaveProfileCommand () { if (IsBusy) return; LoadingMessage = "Saving Profile..."; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("SaveProfile")) { try { if (string.IsNullOrWhiteSpace (nickName)) { RaiseNotification ("Please fill in your nick name."); return; } if (!await RefreshToken ()) return; var userManager = new UserManager (Settings.AccessToken); if (Settings.NickName != nickName) { var success = await userManager.ChangeNickname (nickName); if (!success) { RaiseNotification ("Unable to save profile, please try again."); return; } } Settings.NickName = nickName; await AvatarsSemaphore.WaitAsync(); var selectedAvatar = Avatars.FirstOrDefault (a => a.Location == avatar); AvatarsSemaphore.Release (); if (selectedAvatar != null && Settings.Avatar != avatar) { var ava = await userManager.SetAvatarFromList (selectedAvatar.AvatarId); if (ava == null) { RaiseNotification ("Unable to save profile, please try again."); return; } } Settings.Avatar = avatar; RaiseNotification ("Profile Saved!"); App.Logger.Track ("SaveProfile", new Dictionary<string, string> { { "nickname", Settings.NickName }, { "avatar", Settings.Avatar } }); } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Avatar upload failed. Please try again."); } } } }
public async Task ExecuteValidatePinCommand () { if (App.FakeSignup) { await App.InitDatabase(); CanProgress = true; OnPropertyChanged ("CanProgress"); return; } if (IsBusy) return; CanProgress = false; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("FinalizeSignup")) { try { App.CryptoService.GenerateKeys (); var pk = Convert.ToBase64String (App.CryptoService.PublicKey); var token = await authenticationService.CreateUserDevice ( !string.IsNullOrWhiteSpace(Settings.Email) ? Settings.Email : Settings.PhoneNumber, Pin, pk, nickName); if (token == null || token.AccessToken == null || token.DeviceId == null) { App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } // Initial "AccessToken" is actually the devices password, and needed to get new tokens Settings.DevicePassword = token.AccessToken; Settings.UserDeviceLoginId = token.DeviceLoginId; Settings.UserDeviceId = token.DeviceId; var finalToken = await authenticationService.Authenticate (Settings.UserDeviceLoginId, Settings.DevicePassword); if (finalToken == null || finalToken.AccessToken == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Invalid PIN, please try again"); return; } Settings.AccessToken = finalToken.AccessToken; var nextTime = DateTime.UtcNow.AddSeconds (finalToken.ExpiresIn).Ticks; Settings.KeyValidUntil = nextTime; //need to store when to refresh var userManager = new UserManager (Settings.AccessToken); User user = !string.IsNullOrWhiteSpace(Settings.Email) ? await userManager.GetUserViaEmail (Settings.Email) : await userManager.GetUserViaPhone(Settings.PhoneNumber); if (user == null || user.Devices == null) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.MessageDialog.SendToast ("Issue in registration, please try again."); return; } Settings.MyId = user.Id; Settings.Avatar = user.Avatar.Location; if (App.NotificationsHub != null) { App.NotificationsHub.RegisterForPushNotifications(); } App.Logger.Track ("PickTheme", new Dictionary<string, string> { { "nickname", Settings.NickName }, { "avatar", user.Avatar.Location }, { "theme", Settings.AppTheme == AppTheme.Blue ? "blue" : "red" } }); CanProgress = true; } catch (Exception ex) { Settings.AccessToken = string.Empty; Settings.UserDeviceId = string.Empty; Settings.UserDeviceLoginId = string.Empty; App.Logger.Report (ex); App.MessageDialog.SendToast ("Invalid PIN, please try again"); } } } }
public async Task ExecuteSearchForFriendCommand (string search) { search.Trim (); if (IsBusy) return; LoadingMessage = "Finding Friend..."; using (BusyContext ()) { using (App.Logger.TrackTimeContext ("FriendSearch")) { try { App.Logger.Track ("FriendSearch"); if (!search.IsValidEmail ()) { App.MessageDialog.SendToast ("Please enter a valide email address."); return; } if (!await RefreshToken ()) return; var userManager = new UserManager (Settings.AccessToken); var result = await userManager.GetUserViaEmail (search); IsBusy = false; //did not find anyone //add them and send invite if (result == null || result.Devices == null) { var newFriend = new Friend { FriendId = Settings.GenerateTempFriendId (), Name = search }; await DataManager.AddOrSaveFriendAsync (newFriend); await FriendsSemaphore.WaitAsync(); Friends.Add (newFriend); FriendsSemaphore.Release (); await userManager.SendUserInvite (search); RaiseNotification ("Your friend hasn't signed up for Kinder Chat yet. We have sent them an invite!", "Friend Request Sent"); App.Logger.Track ("FriendRequestSent"); return; } //did you enter yourself? if (!string.IsNullOrWhiteSpace(Settings.Email) && result.Email.ToLowerInvariant () == Settings.Email.ToLowerInvariant ()) { RaiseNotification ("This is you!"); return; } //did you already friend them? await FriendsSemaphore.WaitAsync (); var alreadyFriend = Friends.FirstOrDefault (f => f.FriendId == result.Id) != null; FriendsSemaphore.Release (); if (alreadyFriend) { RaiseNotification ("Friend already added."); return; } //new friend found and we want to add them. var msg = string.Format ("We found {0} do you want to add to friend list?", result.NickName); App.MessageDialog.SendConfirmation (msg, "Friend found!", async add => { if (!add) return; var newFriend = new Friend { FriendId = result.Id, Name = result.NickName, Photo = EndPoints.BaseUrl + result.Avatar.Location, AvatarType = result.Avatar.Type }; await DataManager.AddOrSaveFriendAsync (newFriend); await FriendsSemaphore.WaitAsync (); Friends.Add (newFriend); FriendsSemaphore.Release (); RaiseNotification ("Friend added!"); App.Logger.Track ("FriendAdded"); }); } catch (Exception ex) { App.Logger.Report (ex); RaiseError ("Something has gone wrong, please try to search again."); } } } }
public async Task<Dictionary<string, string>> GetUserDevicesAndPublicKeys(int userId) { var result = await DataManager.GetFriendPublicKeysAsync(userId); if (result.Count < 1) { var userManager = new UserManager(Settings.AccessToken); var user = await userManager.GetUserViaEmail(userId); return await SaveUserDevices(user); } return result; }
public async Task UpdateFriendInfoAsync(Friend item) { if (App.FakeSignup) return; var userManager = new UserManager(Settings.AccessToken); //should it be cached? User user = null; if (item.FriendId < 0) user = await userManager.GetUserViaEmail(item.Name).ConfigureAwait (false); else user = await userManager.GetUserViaEmail((int)item.FriendId).ConfigureAwait (false); if (user != null && user.Devices != null) { //update messages for newly connected friends) if(item.FriendId < 0){ var messages = await DataManager.GetUnsentMessagesAsync (item.FriendId).ConfigureAwait (false); //update each message with new information. foreach (var message in messages) { message.FriendName = user.NickName; message.FriendPhoto = EndPoints.BaseUrl + user.Avatar.Location; message.Recipient = user.Id; message.RecipientName = user.NickName; await DataManager.AddMessageAsync (message).ConfigureAwait (false); } } //user found item.FriendId = user.Id; item.Name = user.NickName; item.Photo = EndPoints.BaseUrl + user.Avatar.Location; item.AvatarType = user.Avatar.Type; await SaveUserDevices(user).ConfigureAwait (false); await DataManager.AddOrSaveFriendAsync(item).ConfigureAwait (false); } }