コード例 #1
0
		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.");
				}
			}
		}
コード例 #2
0
		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;
			}
		}
コード例 #3
0
 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());
 }
コード例 #4
0
 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("*****@*****.**");
 }
コード例 #5
0
		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");
					}
				}
			}
		}
コード例 #6
0
		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 ();
		}
コード例 #7
0
		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.");
					}
				}
			}
		}
コード例 #8
0
		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");
					}
				}
			}
		}
コード例 #9
0
		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.");
					}
				}
			}
		}
コード例 #10
0
	    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;
	    }
コード例 #11
0
	    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);
            }
	    }