/// <summary> /// Gets the name of the facebook user. /// </summary> /// <param name="facebookUser">The facebook user.</param> /// <param name="syncFriends">if set to <c>true</c> [synchronize friends].</param> /// <param name="accessToken">The access token.</param> /// <returns></returns> public static string GetFacebookUserName(FacebookUser facebookUser, bool syncFriends = false, string accessToken = "") { string username = string.Empty; string facebookId = facebookUser.id; string facebookLink = facebookUser.link; string userName = "******" + facebookId; UserLogin user = null; using (var rockContext = new RockContext()) { // Query for an existing user var userLoginService = new UserLoginService(rockContext); user = userLoginService.GetByUserName(userName); // If no user was found, see if we can find a match in the person table if (user == null) { // Get name/email from Facebook login string lastName = facebookUser.last_name.ToStringSafe(); string firstName = facebookUser.first_name.ToStringSafe(); string email = string.Empty; try { email = facebookUser.email.ToStringSafe(); } catch { } Person person = null; // If person had an email, get the first person with the same name and email address. if (!string.IsNullOrWhiteSpace(email)) { var personService = new PersonService(rockContext); var people = personService.GetByMatch(firstName, lastName, email); if (people.Count() == 1) { person = people.First(); } } var personRecordTypeId = DefinedValueCache.Read(SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()).Id; var personStatusPending = DefinedValueCache.Read(SystemGuid.DefinedValue.PERSON_RECORD_STATUS_PENDING.AsGuid()).Id; rockContext.WrapTransaction(() => { if (person == null) { person = new Person(); person.IsSystem = false; person.RecordTypeValueId = personRecordTypeId; person.RecordStatusValueId = personStatusPending; person.FirstName = firstName; person.LastName = lastName; person.Email = email; person.IsEmailActive = true; person.EmailPreference = EmailPreference.EmailAllowed; try { if (facebookUser.gender.ToString() == "male") { person.Gender = Gender.Male; } else if (facebookUser.gender.ToString() == "female") { person.Gender = Gender.Female; } else { person.Gender = Gender.Unknown; } } catch { } if (person != null) { PersonService.SaveNewPerson(person, rockContext, null, false); } } if (person != null) { int typeId = EntityTypeCache.Read(typeof(Facebook)).Id; user = UserLoginService.Create(rockContext, person, AuthenticationServiceType.External, typeId, userName, "fb", true); } }); } if (user != null) { username = user.UserName; if (user.PersonId.HasValue) { var converter = new ExpandoObjectConverter(); var personService = new PersonService(rockContext); var person = personService.Get(user.PersonId.Value); if (person != null) { // If person does not have a photo, try to get their Facebook photo if (!person.PhotoId.HasValue) { var restClient = new RestClient(string.Format("https://graph.facebook.com/v2.5/{0}/picture?redirect=false&type=square&height=400&width=400", facebookId)); var restRequest = new RestRequest(Method.GET); restRequest.RequestFormat = DataFormat.Json; restRequest.AddHeader("Accept", "application/json"); var restResponse = restClient.Execute(restRequest); if (restResponse.StatusCode == HttpStatusCode.OK) { dynamic picData = JsonConvert.DeserializeObject <ExpandoObject>(restResponse.Content, converter); bool isSilhouette = picData.data.is_silhouette; string url = picData.data.url; // If Facebook returned a photo url if (!isSilhouette && !string.IsNullOrWhiteSpace(url)) { // Download the photo from the url provided restClient = new RestClient(url); restRequest = new RestRequest(Method.GET); restResponse = restClient.Execute(restRequest); if (restResponse.StatusCode == HttpStatusCode.OK) { var bytes = restResponse.RawBytes; // Create and save the image BinaryFileType fileType = new BinaryFileTypeService(rockContext).Get(Rock.SystemGuid.BinaryFiletype.PERSON_IMAGE.AsGuid()); if (fileType != null) { var binaryFileService = new BinaryFileService(rockContext); var binaryFile = new BinaryFile(); binaryFileService.Add(binaryFile); binaryFile.IsTemporary = false; binaryFile.BinaryFileType = fileType; binaryFile.MimeType = "image/jpeg"; binaryFile.FileName = user.Person.NickName + user.Person.LastName + ".jpg"; binaryFile.ContentStream = new MemoryStream(bytes); rockContext.SaveChanges(); person.PhotoId = binaryFile.Id; rockContext.SaveChanges(); } } } } } // Save the facebook social media link var facebookAttribute = AttributeCache.Read(Rock.SystemGuid.Attribute.PERSON_FACEBOOK.AsGuid()); if (facebookAttribute != null) { person.LoadAttributes(rockContext); person.SetAttributeValue(facebookAttribute.Key, facebookLink); person.SaveAttributeValues(rockContext); } if (syncFriends && !string.IsNullOrWhiteSpace(accessToken)) { // Get the friend list (only includes friends who have also authorized this app) var restRequest = new RestRequest(Method.GET); restRequest.AddParameter("access_token", accessToken); restRequest.RequestFormat = DataFormat.Json; restRequest.AddHeader("Accept", "application/json"); var restClient = new RestClient(string.Format("https://graph.facebook.com/v2.5/{0}/friends", facebookId)); var restResponse = restClient.Execute(restRequest); if (restResponse.StatusCode == HttpStatusCode.OK) { // Get a list of the facebook ids for each friend dynamic friends = JsonConvert.DeserializeObject <ExpandoObject>(restResponse.Content, converter); var facebookIds = new List <string>(); foreach (var friend in friends.data) { facebookIds.Add(friend.id); } // Queue a transaction to add/remove friend relationships in Rock var transaction = new Rock.Transactions.UpdateFacebookFriends(person.Id, facebookIds); Rock.Transactions.RockQueue.TransactionQueue.Enqueue(transaction); } } } } } return(username); } }
/// <summary> /// Gets the name of the facebook user. /// </summary> /// <param name="facebookUser">The facebook user.</param> /// <param name="syncFriends">if set to <c>true</c> [synchronize friends].</param> /// <param name="accessToken">The access token.</param> /// <returns></returns> public static string GetFacebookUserName( FacebookUser facebookUser, bool syncFriends = false, string accessToken = "" ) { string username = string.Empty; string facebookId = facebookUser.id; string facebookLink = facebookUser.link; string userName = "******" + facebookId; UserLogin user = null; using ( var rockContext = new RockContext() ) { // Query for an existing user var userLoginService = new UserLoginService( rockContext ); user = userLoginService.GetByUserName( userName ); // If no user was found, see if we can find a match in the person table if ( user == null ) { // Get name/email from Facebook login string lastName = facebookUser.last_name.ToStringSafe(); string firstName = facebookUser.first_name.ToStringSafe(); string email = string.Empty; try { email = facebookUser.email.ToStringSafe(); } catch { } Person person = null; // If person had an email, get the first person with the same name and email address. if ( !string.IsNullOrWhiteSpace( email ) ) { var personService = new PersonService( rockContext ); var people = personService.GetByMatch( firstName, lastName, email ); if ( people.Count() == 1) { person = people.First(); } } var personRecordTypeId = DefinedValueCache.Read( SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id; var personStatusPending = DefinedValueCache.Read( SystemGuid.DefinedValue.PERSON_RECORD_STATUS_PENDING.AsGuid() ).Id; rockContext.WrapTransaction( () => { if ( person == null ) { person = new Person(); person.IsSystem = false; person.RecordTypeValueId = personRecordTypeId; person.RecordStatusValueId = personStatusPending; person.FirstName = firstName; person.LastName = lastName; person.Email = email; person.IsEmailActive = true; person.EmailPreference = EmailPreference.EmailAllowed; try { if ( facebookUser.gender.ToString() == "male" ) { person.Gender = Gender.Male; } else if ( facebookUser.gender.ToString() == "female" ) { person.Gender = Gender.Female; } else { person.Gender = Gender.Unknown; } } catch { } if ( person != null ) { PersonService.SaveNewPerson( person, rockContext, null, false ); } } if ( person != null ) { int typeId = EntityTypeCache.Read( typeof( Facebook ) ).Id; user = UserLoginService.Create( rockContext, person, AuthenticationServiceType.External, typeId, userName, "fb", true ); } } ); } if ( user != null ) { username = user.UserName; if ( user.PersonId.HasValue ) { var converter = new ExpandoObjectConverter(); var personService = new PersonService( rockContext ); var person = personService.Get( user.PersonId.Value ); if ( person != null ) { // If person does not have a photo, try to get their Facebook photo if ( !person.PhotoId.HasValue ) { var restClient = new RestClient( string.Format( "https://graph.facebook.com/v2.2/{0}/picture?redirect=false&type=square&height=400&width=400", facebookId ) ); var restRequest = new RestRequest( Method.GET ); restRequest.RequestFormat = DataFormat.Json; restRequest.AddHeader( "Accept", "application/json" ); var restResponse = restClient.Execute( restRequest ); if ( restResponse.StatusCode == HttpStatusCode.OK ) { dynamic picData = JsonConvert.DeserializeObject<ExpandoObject>( restResponse.Content, converter ); bool isSilhouette = picData.data.is_silhouette; string url = picData.data.url; // If Facebook returned a photo url if ( !isSilhouette && !string.IsNullOrWhiteSpace( url ) ) { // Download the photo from the url provided restClient = new RestClient( url ); restRequest = new RestRequest( Method.GET ); restResponse = restClient.Execute( restRequest ); if ( restResponse.StatusCode == HttpStatusCode.OK ) { var bytes = restResponse.RawBytes; // Create and save the image BinaryFileType fileType = new BinaryFileTypeService( rockContext ).Get( Rock.SystemGuid.BinaryFiletype.PERSON_IMAGE.AsGuid() ); if ( fileType != null ) { var binaryFileService = new BinaryFileService( rockContext ); var binaryFile = new BinaryFile(); binaryFileService.Add( binaryFile ); binaryFile.IsTemporary = false; binaryFile.BinaryFileType = fileType; binaryFile.MimeType = "image/jpeg"; binaryFile.FileName = user.Person.NickName + user.Person.LastName + ".jpg"; binaryFile.ContentStream = new MemoryStream( bytes ); rockContext.SaveChanges(); person.PhotoId = binaryFile.Id; rockContext.SaveChanges(); } } } } } // Save the facebook social media link var facebookAttribute = AttributeCache.Read( Rock.SystemGuid.Attribute.PERSON_FACEBOOK.AsGuid() ); if ( facebookAttribute != null ) { person.LoadAttributes( rockContext ); person.SetAttributeValue( facebookAttribute.Key, facebookLink ); person.SaveAttributeValues( rockContext ); } if ( syncFriends && !string.IsNullOrWhiteSpace( accessToken ) ) { // Get the friend list (only includes friends who have also authorized this app) var restRequest = new RestRequest( Method.GET ); restRequest.AddParameter( "access_token", accessToken ); restRequest.RequestFormat = DataFormat.Json; restRequest.AddHeader( "Accept", "application/json" ); var restClient = new RestClient( string.Format( "https://graph.facebook.com/v2.2/{0}/friends", facebookId ) ); var restResponse = restClient.Execute( restRequest ); if ( restResponse.StatusCode == HttpStatusCode.OK ) { // Get a list of the facebook ids for each friend dynamic friends = JsonConvert.DeserializeObject<ExpandoObject>( restResponse.Content, converter ); var facebookIds = new List<string>(); foreach ( var friend in friends.data ) { facebookIds.Add( friend.id ); } // Queue a transaction to add/remove friend relationships in Rock var transaction = new Rock.Transactions.UpdateFacebookFriends( person.Id, facebookIds ); Rock.Transactions.RockQueue.TransactionQueue.Enqueue( transaction ); } } } } } return username; } }