Reputation: 1397
I am using Facebook.dll i.s FacebookClient , Mainly I want to read Facebook user mail box I have auth token saved in db.
I have used
dynamic result = objFacebookClient.Get("fql",
new { q = "SELECT message_id, author_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });
Is it possible get result as
Code is here
dynamic result = objFacebookClient.Get("fql",
new { q = "SELECT message_id, author_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });
List<Model.FacebookUserMessageInfo> objFacebookMessageList = new List<Model.FacebookUserMessageInfo>();
if (result != null)
{
Model.FacebookUserMessageInfo objFacebookMessage = null;
var values = result.Values;
var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
var TotalMessagesData = (JsonArray)TotalResult;
if (TotalMessagesData != null)
{
foreach (var Messages in TotalMessagesData)
{
objFacebookMessage = new Model.FacebookUserMessageInfo();
objFacebookMessage.MessageText = (((JsonObject)Messages)["body"]).ToString();
objFacebookMessage.ActionUserID = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
if (objFacebookMessage.ActionUserID == CurrentUserId)
{
objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Sent.ToString();
}
else
{
objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Receive.ToString();
}
objFacebookMessage.FacebookUserId = FacebookUserId;
var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
objFacebookMessage.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));
objFacebookMessageList.Add(objFacebookMessage);
}
}
}
Thanks in advance
Upvotes: 1
Views: 2981
Reputation: 1397
I got my solution
public class Facebook
{
#region Private Properties
private string ClientId = System.Configuration.ConfigurationManager.AppSettings["ClientId"];
private string ClientSecret = System.Configuration.ConfigurationManager.AppSettings["ClientSecret"];
#endregion
#region Public Methods
public string GetLongLifeAccessToken(string ExistingToken)
{
try
{
string Data = string.Empty;
string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2} ",
ClientId, ClientSecret, ExistingToken);
System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
using (System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
{
System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream());
Data = sr.ReadToEnd();
Data = HttpUtility.ParseQueryString(Data)["access_token"];
}
return Data;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public List<Model.FacebookUserMessageInfo> ReadFacebookMailbox(string AuthToken, long? CurrentUserDefaultFacebookId, DateTime? LastProcessedDate, DateTime CurrentDate, int FacebookUserId)
{
try
{
FacebookClient objFacebookClient;
List<Model.FacebookUserMessageInfo> objFacebookMessageList;
objFacebookClient = new FacebookClient(AuthToken);
try
{
objFacebookClient.Get("me");
}
catch (Exception ex)
{
throw new Exception(ErrorType.UnableToAuthorizFacebookUser.ToString());
}
TimeSpan t = LastProcessedDate.Value - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
int timestamp = (int)t.TotalSeconds;
dynamic result = objFacebookClient.Get("fql",
new { q = "SELECT message_id, author_id, viewer_id, body, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0) AND created_time >= " + timestamp.ToString() });
objFacebookMessageList = new List<Model.FacebookUserMessageInfo>();
if (result != null)
{
Model.FacebookUserMessageInfo objFacebookMessage = null;
var values = result.Values;
var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
var TotalMessagesData = (JsonArray)TotalResult;
if (TotalMessagesData != null)
{
foreach (var Messages in TotalMessagesData)
{
/*author_id = The ID of the user who wrote this message.*/
/*viewer_id = The ID of the user whose Inbox you are querying*/
objFacebookMessage = new Model.FacebookUserMessageInfo();
objFacebookMessage.MessageText = (((JsonObject)Messages)["body"]).ToString();
long author_id = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
long viewer_id = Convert.ToInt64(((JsonObject)Messages)["viewer_id"]);
if (author_id == viewer_id)
{
objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Sent.ToString();
}
else
{
objFacebookMessage.MessageType = Core.Enum.FacebookMessageType.Receive.ToString();
}
objFacebookMessage.ActionUserID = author_id;
objFacebookMessage.FacebookUserId = FacebookUserId;
var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
objFacebookMessage.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));
objFacebookMessageList.Add(objFacebookMessage);
}
}
}
if (objFacebookMessageList.Count > 0)
{
objFacebookMessageList = objFacebookMessageList.Where(fm => fm.CreatedDate >= LastProcessedDate && fm.CreatedDate <= CurrentDate).ToList();
objFacebookMessageList.ForEach(item =>
{
var Auther = objFacebookClient.Get("https://graph.facebook.com/" + item.ActionUserID.ToString());
if (Auther != null)
{
item.ActionUserName = ((JsonObject)Auther)["name"].ToString();
}
else
{
item.ActionUserName = null;
}
});
}
return objFacebookMessageList;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
}
Upvotes: 1
Reputation: 19047
If i understand what you want the answer is:
you need to create a class, FacebookMessage:
class FacebookMessage
{
public int SenderID { get; set; }
public int AddresseeID { get; set; }
public string SenderName { get; set; }
public string AddresseeName { get; set; }
public string Message { get; set; }
public DateTime CreateDate { get; set; }
public FacebookMessage()
{
SenderID = 0;
AddresseeID = 0;
SenderName = "";
AddresseeName = "";
Message = "";
}
}
and use this FQL:
dynamic result = objFacebookClient.Get("fql",
new { q = "SELECT body, author_id, viewer_id, created_time FROM message WHERE thread_id IN (SELECT thread_id FROM thread WHERE folder_id = 0)" });
After getting this info and save it in the FacebookMessage and run another query for each message:
FacebookMessage faceMsg = null;
var values = result.Values;
var TotalResult = (((System.Collections.Generic.Dictionary<string, object>.ValueCollection)values).ToList()[0]);
var TotalMessagesData = (JsonArray)TotalResult;
if (TotalMessagesData != null)
{
foreach (var Messages in TotalMessagesData)
{
faceMsg= new FacebookMessage();
faceMsg.Message = (((JsonObject)Messages)["body"]).ToString();
faceMsg.SenderID = Convert.ToInt64(((JsonObject)Messages)["author_id"]);
faceMsg.AddresseeID = Convert.ToInt64(((JsonObject)Messages)["viewer_id"]);
var MessageSecond = (((JsonObject)Messages)["created_time"]).ToString();
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
faceMsg.CreatedDate = dateTime.AddSeconds(double.Parse(MessageSecond));
result = objFacebookClient.Get("fql",
new { q = "SELECT name FROM user WHERE uid = " + faceMsg.SenderID });
var values = result.Values;
faceMsg.SenderName = values.name; // Not tested, but should be something like that.
result = objFacebookClient.Get("fql",
new { q = "SELECT name FROM user WHERE uid = " + faceMsg.AddresseeID });
var values = result.Values;
faceMsg.AddresseeName= values.name; // Not tested, but should be something like that.
faceMsgList.Add(objFacebookMessage);
}
}
It is recommended to split the querys that get the names to diffrent methods.
Upvotes: 0