Merge pull request #180 from woakesd/add-get-contacts

Add get contacts
This commit is contained in:
Ilya Pirozhenko 2016-07-21 15:07:22 +03:00 committed by GitHub
commit 29568bef11
8 changed files with 125 additions and 93 deletions

View file

@ -11,7 +11,7 @@ namespace TLSharp.Core.Auth
var step1 = new Step1_PQRequest();
await sender.Send(step1.ToBytes());
var step1Response = step1.FromBytes(await sender.Recieve());
var step1Response = step1.FromBytes(await sender.Receive());
var step2 = new Step2_DHExchange();
await sender.Send(step2.ToBytes(
@ -20,7 +20,7 @@ namespace TLSharp.Core.Auth
step1Response.Fingerprints,
step1Response.Pq));
var step2Response = step2.FromBytes(await sender.Recieve());
var step2Response = step2.FromBytes(await sender.Receive());
var step3 = new Step3_CompleteDHExchange();
await sender.Send(step3.ToBytes(
@ -29,7 +29,7 @@ namespace TLSharp.Core.Auth
step2Response.NewNonce,
step2Response.EncryptedAnswer));
var step3Response = step3.FromBytes(await sender.Recieve());
var step3Response = step3.FromBytes(await sender.Receive());
return step3Response;
}

View file

@ -5960,6 +5960,12 @@ namespace TLSharp.Core.MTProto
}
}
public class ContactsContacts
{
public IList<Contact> Contacts { get; set; }
public IList<User> Users { get; set; }
}
public class MessageDialogs
{
public int? Count { get; set; }

View file

@ -36,7 +36,7 @@ namespace TLSharp.Core.Network
}
}
public async Task<byte[]> Recieve()
public async Task<byte[]> Receive()
{
var result = await _transport.Receieve();

View file

@ -132,7 +132,7 @@ namespace TLSharp.Core.Network
return new Tuple<byte[], ulong, int>(message, remoteMessageId, remoteSequence);
}
public async Task<byte[]> Recieve(MTProtoRequest request)
public async Task<byte[]> Receive(MTProtoRequest request)
{
while (!request.ConfirmReceived)
{

View file

@ -1,72 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TLSharp.Core.MTProto;
namespace TLSharp.Core.Requests
{
public class GetContactRequest : MTProtoRequest
{
private List<int> currentContacts { get; set; }
public List<Contact> contacts;
public List<UserContactConstructor> users;
public GetContactRequest(List<int> currentContactsID = null)
{
currentContacts = currentContactsID;
}
public override void OnSend(BinaryWriter writer)
{
writer.Write(0x22c6aa08);
if (currentContacts == null)
Serializers.String.write(writer, "");
else
{
string hash = "";
foreach (var currentUserID in currentContacts)
{
var md5 = Utils.Helpers.md5(currentUserID.ToString());
hash += md5 + ",";
}
hash = hash.Length > 0 ? hash.Remove(hash.LastIndexOf(','), 1) : Utils.Helpers.md5( hash);
Serializers.String.write(writer, hash);
}
}
public override void OnResponse(BinaryReader reader)
{
var code = reader.ReadUInt32();
var result = reader.ReadInt32(); // vector code
int contact_len = reader.ReadInt32();
this.contacts = new List<Contact>(contact_len);
for (int imported_index = 0; imported_index < contact_len; imported_index++)
{
Contact imported_element;
imported_element = TL.Parse<Contact>(reader);
this.contacts.Add(imported_element);
}
reader.ReadInt32(); // vector code
int users_len = reader.ReadInt32();
this.users = new List<UserContactConstructor>(users_len);
for (int users_index = 0; users_index < users_len; users_index++)
{
UserContactConstructor users_element;
users_element = TL.Parse<UserContactConstructor>(reader);
this.users.Add(users_element);
}
}
public override void OnException(Exception exception)
{
throw new NotImplementedException();
}
public override bool Confirmed { get { return true; } }
private readonly bool responded;
public override bool Responded { get { return responded; } }
}
}

View file

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TLSharp.Core.MTProto;
using System.Security.Cryptography;
namespace TLSharp.Core.Requests
{
public class GetContactsRequest : MTProtoRequest
{
private List<int> CurrentContacts { get; set; }
public List<Contact> Contacts;
public List<User> Users;
public GetContactsRequest(IList<int> currentContacts = null)
{
if (currentContacts != null)
{
CurrentContacts = currentContacts.ToList();
CurrentContacts.Sort();
}
}
public override void OnSend(BinaryWriter writer)
{
writer.Write(0x22c6aa08);
if (CurrentContacts == null)
Serializers.String.write(writer, "");
else
{
// create CSV of contactids and calculate md5 hash
string hash;
var list = string.Join(",", CurrentContacts);
using (var md5 = MD5.Create())
{
var retVal = md5.ComputeHash(Encoding.UTF8.GetBytes(list));
var sb = new StringBuilder();
foreach (var t in retVal)
{
sb.Append(t.ToString("x2"));
}
hash = sb.ToString();
}
Serializers.String.write(writer, hash);
}
}
public override void OnResponse(BinaryReader reader)
{
var code = reader.ReadUInt32();
// if contactsNotModified then exit
if (code == 0xb74ba9d2) return;
reader.ReadInt32(); // vector code
var contactLen = reader.ReadInt32();
Contacts = new List<Contact>(contactLen);
for (var importedIndex = 0; importedIndex < contactLen; importedIndex++)
{
var importedElement = TL.Parse<Contact>(reader);
this.Contacts.Add(importedElement);
}
reader.ReadInt32(); // vector code
var usersLen = reader.ReadInt32();
Users = new List<User>(usersLen);
for (var usersIndex = 0; usersIndex < usersLen; usersIndex++)
{
var usersElement = TL.Parse<User>(reader);
this.Users.Add(usersElement);
}
}
public override void OnException(Exception exception)
{
throw new NotImplementedException();
}
public override bool Confirmed { get { return true; } }
private readonly bool _responded;
public override bool Responded { get { return _responded; } }
}
}

View file

@ -69,6 +69,7 @@
<Compile Include="Requests\AuthSendSmsRequest.cs" />
<Compile Include="Requests\AuthSignInRequest.cs" />
<Compile Include="Requests\AuthSignUpRequest.cs" />
<Compile Include="Requests\GetContactsRequest.cs" />
<Compile Include="Requests\GetDialogsRequest.cs" />
<Compile Include="Requests\GetFileRequest.cs" />
<Compile Include="Requests\GetHistoryRequest.cs" />
@ -100,4 +101,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View file

@ -55,7 +55,7 @@ namespace TLSharp.Core
var request = new InitConnectionRequest(_apiId);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
dcOptions = request.ConfigConstructor.dc_options;
}
@ -89,7 +89,7 @@ namespace TLSharp.Core
var authCheckPhoneRequest = new AuthCheckPhoneRequest(phoneNumber);
await _sender.Send(authCheckPhoneRequest);
await _sender.Recieve(authCheckPhoneRequest);
await _sender.Receive(authCheckPhoneRequest);
return authCheckPhoneRequest._phoneRegistered;
}
@ -105,10 +105,8 @@ namespace TLSharp.Core
request = new AuthSendCodeRequest(phoneNumber, (int)tokenDestination, _apiId, _apiHash, "en");
try
{
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
completed = true;
}
@ -132,7 +130,7 @@ namespace TLSharp.Core
{
var request = new AuthSignInRequest(phoneNumber, phoneHash, code);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
_session.SessionExpires = request.SessionExpires;
_session.User = request.user;
@ -165,7 +163,7 @@ namespace TLSharp.Core
{
var saveFilePartRequest = new Upload_SaveFilePartRequest(file_id, i, partedData[i]);
await _sender.Send(saveFilePartRequest);
await _sender.Recieve(saveFilePartRequest);
await _sender.Receive(saveFilePartRequest);
if (saveFilePartRequest.Done == false)
throw new InvalidOperationException($"File part {i} does not uploaded");
@ -195,7 +193,7 @@ namespace TLSharp.Core
new InputMediaUploadedPhotoConstructor(file));
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return true;
}
@ -207,7 +205,7 @@ namespace TLSharp.Core
var request = new ImportContactRequest(new InputPhoneContactConstructor(0, phoneNumber, "My Test Name", String.Empty));
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
var importedUser = (ImportedContactConstructor)request.imported.FirstOrDefault();
@ -221,7 +219,7 @@ namespace TLSharp.Core
var request = new ImportByUserName(username);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return request.id;
}
@ -231,14 +229,14 @@ namespace TLSharp.Core
var request = new SendMessageRequest(new InputPeerContactConstructor(id), message);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
}
public async Task<List<Message>> GetMessagesHistoryForContact(int user_id, int offset, int limit, int max_id = -1)
{
var request = new GetHistoryRequest(new InputPeerContactConstructor(user_id), offset, max_id, limit);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return request.messages;
}
@ -247,7 +245,7 @@ namespace TLSharp.Core
{
var request = new GetFileRequest(new InputFileLocationConstructor(volume_id, local_id, secret), offset, limit);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return Tuple.Create(request.type, request.bytes);
}
@ -256,7 +254,7 @@ namespace TLSharp.Core
{
var request = new GetDialogsRequest(offset, max_id, limit);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return new MessageDialogs
{
@ -271,7 +269,7 @@ namespace TLSharp.Core
{
var request = new GetUserFullRequest(user_id);
await _sender.Send(request);
await _sender.Recieve(request);
await _sender.Receive(request);
return request._userFull;
}
@ -282,5 +280,19 @@ namespace TLSharp.Core
return regex.IsMatch(number);
}
public async Task<ContactsContacts> GetContacts(IList<int> contactIds = null)
{
var request = new GetContactsRequest(contactIds);
await _sender.Send(request);
await _sender.Receive(request);
return new ContactsContacts
{
Contacts = request.Contacts,
Users = request.Users,
};
}
}
}