mirror of
https://github.com/sochix/TLSharp.git
synced 2025-12-06 08:02:00 +01:00
commit
7d436e3954
|
|
@ -148,16 +148,16 @@ Contributing is highly appreciated!
|
||||||
|
|
||||||
#### Release 1.0.0
|
#### Release 1.0.0
|
||||||
|
|
||||||
* Add PHONE_MIGRATE handling
|
* [DONE] Add PHONE_MIGRATE handling
|
||||||
* Add Updates handling
|
* Add Updates handling
|
||||||
* Add NuGet package
|
* Add NuGet package
|
||||||
* Add wrappers for media uploading
|
* [WIP] Add wrappers for media uploading
|
||||||
* Store user session as JSON
|
* Store user session as JSON
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
|
|
||||||
#### What API layer is supported?
|
#### What API layer is supported?
|
||||||
The latest one - 53. Thanks to Afshin Arani
|
The latest one - 57. Thanks to Afshin Arani for his TLGenerator
|
||||||
|
|
||||||
#### I get an error MIGRATE_X?
|
#### I get an error MIGRATE_X?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,9 @@ namespace TLSharp.Core
|
||||||
|
|
||||||
public class Session
|
public class Session
|
||||||
{
|
{
|
||||||
private const string defaultConnectionAddress = "91.108.56.165";
|
private const string defaultConnectionAddress = "149.154.175.100";//"149.154.167.50";
|
||||||
private const int defaultConnectionPort = 443;
|
|
||||||
|
private const int defaultConnectionPort = 443;
|
||||||
|
|
||||||
public string SessionUserId { get; set; }
|
public string SessionUserId { get; set; }
|
||||||
public string ServerAddress { get; set; }
|
public string ServerAddress { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ namespace TLSharp.Core
|
||||||
|
|
||||||
public TelegramClient(int apiId, string apiHash, ISessionStore store = null, string sessionUserId = "session")
|
public TelegramClient(int apiId, string apiHash, ISessionStore store = null, string sessionUserId = "session")
|
||||||
{
|
{
|
||||||
if (store == null)
|
if (store == null)
|
||||||
store = new FileSessionStore();
|
store = new FileSessionStore();
|
||||||
|
|
||||||
TLContext.Init();
|
TLContext.Init();
|
||||||
_apiHash = apiHash;
|
_apiHash = apiHash;
|
||||||
|
|
@ -51,16 +51,14 @@ namespace TLSharp.Core
|
||||||
|
|
||||||
_sender = new MtProtoSender(_transport, _session);
|
_sender = new MtProtoSender(_transport, _session);
|
||||||
|
|
||||||
if (!reconnect)
|
//set-up layer
|
||||||
{
|
var config = new TLRequestGetConfig();
|
||||||
var config = new TLRequestGetConfig() ;
|
var request = new TLRequestInitConnection() { api_id = _apiId, app_version = "1.0.0", device_model = "PC", lang_code = "en", query = config, system_version = "Win 10.0" };
|
||||||
var request = new TLRequestInitConnection() { api_id = _apiId, app_version = "1.0.0", device_model = "PC", lang_code = "en", query= config, system_version = "Win 10.0" };
|
var invokewithLayer = new TLRequestInvokeWithLayer() { layer = 57, query = request };
|
||||||
var invokewithLayer = new TLRequestInvokeWithLayer() { layer = 53, query = request };
|
await _sender.Send(invokewithLayer);
|
||||||
await _sender.Send(invokewithLayer);
|
await _sender.Receive(invokewithLayer);
|
||||||
await _sender.Receive(invokewithLayer);
|
|
||||||
|
|
||||||
dcOptions = ((TLConfig)invokewithLayer.Response).dc_options.lists;
|
dcOptions = ((TLConfig)invokewithLayer.Response).dc_options.lists;
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -154,62 +152,61 @@ namespace TLSharp.Core
|
||||||
await _sender.Send(methodtoExceute);
|
await _sender.Send(methodtoExceute);
|
||||||
await _sender.Receive(methodtoExceute);
|
await _sender.Receive(methodtoExceute);
|
||||||
|
|
||||||
var result = methodtoExceute.GetType().GetProperty("Response").GetValue(methodtoExceute);
|
var result = methodtoExceute.GetType().GetProperty("Response").GetValue(methodtoExceute);
|
||||||
|
|
||||||
return (T)result;
|
return (T)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<TLContacts> GetContactsAsync()
|
||||||
|
{
|
||||||
|
if (!IsUserAuthorized())
|
||||||
|
throw new InvalidOperationException("Authorize user first!");
|
||||||
|
|
||||||
public async Task<TLContacts> GetContactsAsync()
|
var req = new TLRequestGetContacts() { hash = "" };
|
||||||
{
|
|
||||||
if (!IsUserAuthorized())
|
|
||||||
throw new InvalidOperationException("Authorize user first!");
|
|
||||||
|
|
||||||
var req = new TLRequestGetContacts() {hash = ""};
|
return await SendRequestAsync<TLContacts>(req);
|
||||||
|
}
|
||||||
return await SendRequestAsync<TLContacts>(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<TLAbsUpdates> SendMessageAsync(TLAbsInputPeer peer, string message)
|
public async Task<TLAbsUpdates> SendMessageAsync(TLAbsInputPeer peer, string message)
|
||||||
{
|
{
|
||||||
if (!IsUserAuthorized())
|
if (!IsUserAuthorized())
|
||||||
throw new InvalidOperationException("Authorize user first!");
|
throw new InvalidOperationException("Authorize user first!");
|
||||||
|
|
||||||
long uniqueId = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds);
|
long uniqueId = Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds);
|
||||||
|
|
||||||
return await SendRequestAsync<TLAbsUpdates>(
|
return await SendRequestAsync<TLAbsUpdates>(
|
||||||
new TLRequestSendMessage()
|
new TLRequestSendMessage()
|
||||||
{
|
{
|
||||||
peer = peer,
|
peer = peer,
|
||||||
message = message,
|
message = message,
|
||||||
random_id = uniqueId
|
random_id = uniqueId
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Boolean> SendTypingAsync(TLAbsInputPeer peer)
|
public async Task<Boolean> SendTypingAsync(TLAbsInputPeer peer)
|
||||||
{
|
{
|
||||||
var req = new TLRequestSetTyping()
|
var req = new TLRequestSetTyping()
|
||||||
{
|
{
|
||||||
action = new TLSendMessageTypingAction(),
|
action = new TLSendMessageTypingAction(),
|
||||||
peer = peer
|
peer = peer
|
||||||
};
|
};
|
||||||
return await SendRequestAsync<Boolean>(req);
|
return await SendRequestAsync<Boolean>(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TLDialogs> GetUserDialogsAsync()
|
public async Task<TLDialogs> GetUserDialogsAsync()
|
||||||
{
|
{
|
||||||
var peer = new TLInputPeerSelf();
|
var peer = new TLInputPeerSelf();
|
||||||
return await SendRequestAsync<TLDialogs>(
|
return await SendRequestAsync<TLDialogs>(
|
||||||
new TLRequestGetDialogs() { offset_date = 0, offset_peer = peer, limit = 100 });
|
new TLRequestGetDialogs() { offset_date = 0, offset_peer = peer, limit = 100 });
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnUserAuthenticated(TLUser TLUser)
|
private void OnUserAuthenticated(TLUser TLUser)
|
||||||
{
|
{
|
||||||
_session.TLUser = TLUser;
|
_session.TLUser = TLUser;
|
||||||
_session.SessionExpires = int.MaxValue;
|
_session.SessionExpires = int.MaxValue;
|
||||||
|
|
||||||
_session.Save();
|
_session.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ namespace TeleSharp.Generator
|
||||||
if (nspace.EndsWith("."))
|
if (nspace.EndsWith("."))
|
||||||
nspace = nspace.Remove(nspace.Length - 1, 1);
|
nspace = nspace.Remove(nspace.Length - 1, 1);
|
||||||
string temp = NormalStyle.Replace("/* NAMESPACE */", "TeleSharp." + nspace);
|
string temp = NormalStyle.Replace("/* NAMESPACE */", "TeleSharp." + nspace);
|
||||||
temp = (c.type == "himself") ? temp.Replace("/* PARENT */", "TLObject") : temp.Replace("/* PARENT */", GetNameofClass(c.type, true));
|
temp = (c.type == "himself") ? temp.Replace("/* PARENT */", "TLObject") : temp.Replace("/* PARENT */", GetNameofClass(c.type, true));
|
||||||
temp = temp.Replace("/*Constructor*/", c.id.ToString());
|
temp = temp.Replace("/*Constructor*/", c.id.ToString());
|
||||||
temp = temp.Replace("/* NAME */", GetNameofClass(c.predicate, false));
|
temp = temp.Replace("/* NAME */", GetNameofClass(c.predicate, false));
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -129,11 +129,7 @@ namespace TeleSharp.Generator
|
||||||
}
|
}
|
||||||
foreach (var c in schema.methods)
|
foreach (var c in schema.methods)
|
||||||
{
|
{
|
||||||
if (c.method.Contains("updateUsername"))
|
string path = (GetNameSpace(c.method).Replace("TeleSharp.TL", "TL\\").Replace(".", "") + "\\" + GetNameofClass(c.method, false, true) + ".cs").Replace("\\\\", "\\");
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
string path = (GetNameSpace(c.method).Replace("TeleSharp.TL", "TL\\").Replace(".", "") + "\\" + GetNameofClass(c.method, false,true) + ".cs").Replace("\\\\", "\\");
|
|
||||||
FileStream classFile = MakeFile(path);
|
FileStream classFile = MakeFile(path);
|
||||||
using (StreamWriter writer = new StreamWriter(classFile))
|
using (StreamWriter writer = new StreamWriter(classFile))
|
||||||
{
|
{
|
||||||
|
|
@ -144,7 +140,7 @@ namespace TeleSharp.Generator
|
||||||
string temp = MethodStyle.Replace("/* NAMESPACE */", "TeleSharp." + nspace);
|
string temp = MethodStyle.Replace("/* NAMESPACE */", "TeleSharp." + nspace);
|
||||||
temp = temp.Replace("/* PARENT */", "TLMethod");
|
temp = temp.Replace("/* PARENT */", "TLMethod");
|
||||||
temp = temp.Replace("/*Constructor*/", c.id.ToString());
|
temp = temp.Replace("/*Constructor*/", c.id.ToString());
|
||||||
temp = temp.Replace("/* NAME */", GetNameofClass(c.method, false,true));
|
temp = temp.Replace("/* NAME */", GetNameofClass(c.method, false, true));
|
||||||
#endregion
|
#endregion
|
||||||
#region Fields
|
#region Fields
|
||||||
string fields = "";
|
string fields = "";
|
||||||
|
|
@ -244,7 +240,7 @@ namespace TeleSharp.Generator
|
||||||
else if (type.IndexOf('.') != -1 && type.IndexOf('?') != -1)
|
else if (type.IndexOf('.') != -1 && type.IndexOf('?') != -1)
|
||||||
return "TLRequest" + FormatName(type.Split('?')[1]);
|
return "TLRequest" + FormatName(type.Split('?')[1]);
|
||||||
else
|
else
|
||||||
return "TLRequest" + FormatName(type) ;
|
return "TLRequest" + FormatName(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private static bool IsFlagBase(string type)
|
private static bool IsFlagBase(string type)
|
||||||
|
|
@ -274,13 +270,12 @@ namespace TeleSharp.Generator
|
||||||
{
|
{
|
||||||
string innerType = type.Split('?')[1];
|
string innerType = type.Split('?')[1];
|
||||||
if (innerType == "true") return result;
|
if (innerType == "true") return result;
|
||||||
else if ((new string[] {"bool","int", "uint", "long", "double" }).Contains(result)) return result + "?";
|
else if ((new string[] { "bool", "int", "uint", "long", "double" }).Contains(result)) return result + "?";
|
||||||
else return result;
|
else return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static string GetTypeName(string type)
|
public static string GetTypeName(string type)
|
||||||
{
|
{
|
||||||
if (type.ToLower().Contains("inputcontact")) return "TLInputPhoneContact";
|
|
||||||
switch (type.ToLower())
|
switch (type.ToLower())
|
||||||
{
|
{
|
||||||
case "#":
|
case "#":
|
||||||
|
|
@ -304,35 +299,39 @@ namespace TeleSharp.Generator
|
||||||
case "x":
|
case "x":
|
||||||
return "TLObject";
|
return "TLObject";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type.StartsWith("Vector"))
|
if (type.StartsWith("Vector"))
|
||||||
return "TLVector<" + GetTypeName(type.Replace("Vector<", "").Replace(">", "")) + ">";
|
return "TLVector<" + GetTypeName(type.Replace("Vector<", "").Replace(">", "")) + ">";
|
||||||
|
|
||||||
|
if (type.ToLower().Contains("inputcontact"))
|
||||||
|
return "TLInputPhoneContact";
|
||||||
|
|
||||||
|
|
||||||
|
if (type.IndexOf('.') != -1 && type.IndexOf('?') == -1)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (interfacesList.Any(x => x.ToLower() == (type).ToLower()))
|
||||||
|
return FormatName(type.Split('.')[0]) + "." + "TLAbs" + type.Split('.')[1];
|
||||||
|
else if (classesList.Any(x => x.ToLower() == (type).ToLower()))
|
||||||
|
return FormatName(type.Split('.')[0]) + "." + "TL" + type.Split('.')[1];
|
||||||
|
else
|
||||||
|
return FormatName(type.Split('.')[1]);
|
||||||
|
}
|
||||||
|
else if (type.IndexOf('?') == -1)
|
||||||
|
{
|
||||||
|
if (interfacesList.Any(x => x.ToLower() == type.ToLower()))
|
||||||
|
return "TLAbs" + type;
|
||||||
|
else if (classesList.Any(x => x.ToLower() == type.ToLower()))
|
||||||
|
return "TL" + type;
|
||||||
|
else
|
||||||
|
return type;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (type.IndexOf('.') != -1 && type.IndexOf('?') == -1)
|
return GetTypeName(type.Split('?')[1]);
|
||||||
{
|
|
||||||
|
|
||||||
if (interfacesList.Any(x => x.ToLower() == (type).ToLower()))
|
|
||||||
return FormatName(type.Split('.')[0]) + "." + "TLAbs" + type.Split('.')[1];
|
|
||||||
else if (classesList.Any(x => x.ToLower() == (type).ToLower()))
|
|
||||||
return FormatName(type.Split('.')[0]) + "." + "TL" + type.Split('.')[1];
|
|
||||||
else
|
|
||||||
return FormatName(type.Split('.')[1]);
|
|
||||||
}
|
|
||||||
else if (type.IndexOf('?') == -1)
|
|
||||||
{
|
|
||||||
if (interfacesList.Any(x => x.ToLower() == type.ToLower()))
|
|
||||||
return "TLAbs" + type;
|
|
||||||
else if (classesList.Any(x => x.ToLower() == type.ToLower()))
|
|
||||||
return "TL" + type;
|
|
||||||
else
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return GetTypeName(type.Split('?')[1]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
public static string LookTypeInLists(string src)
|
public static string LookTypeInLists(string src)
|
||||||
{
|
{
|
||||||
|
|
@ -401,7 +400,7 @@ namespace TeleSharp.Generator
|
||||||
{
|
{
|
||||||
if (p.type.ToLower().Contains("vector"))
|
if (p.type.ToLower().Contains("vector"))
|
||||||
{
|
{
|
||||||
return $"{CheckForKeyword(p.name)} = ({GetTypeName(p.type)})ObjectUtils.DeserializeVector<{GetTypeName(p.type).Replace("TLVector<","").Replace(">","")}>(br);";
|
return $"{CheckForKeyword(p.name)} = ({GetTypeName(p.type)})ObjectUtils.DeserializeVector<{GetTypeName(p.type).Replace("TLVector<", "").Replace(">", "")}>(br);";
|
||||||
}
|
}
|
||||||
else return $"{CheckForKeyword(p.name)} = ({GetTypeName(p.type)})ObjectUtils.DeserializeObject(br);";
|
else return $"{CheckForKeyword(p.name)} = ({GetTypeName(p.type)})ObjectUtils.DeserializeObject(br);";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ namespace TeleSharp.TL.Contacts
|
||||||
|
|
||||||
public override void DeserializeBody(BinaryReader br)
|
public override void DeserializeBody(BinaryReader br)
|
||||||
{
|
{
|
||||||
contacts = ObjectUtils.DeserializeVector<TLInputPhoneContact>(br);
|
contacts = (TLVector<TLInputPhoneContact>)ObjectUtils.DeserializeVector<TLInputPhoneContact>(br);
|
||||||
replace = BoolUtil.Deserialize(br);
|
replace = BoolUtil.Deserialize(br);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue