summaryrefslogtreecommitdiff
path: root/libs/tdlib/td/example/csharp/TdExample.cs
diff options
context:
space:
mode:
Diffstat (limited to 'libs/tdlib/td/example/csharp/TdExample.cs')
-rw-r--r--libs/tdlib/td/example/csharp/TdExample.cs270
1 files changed, 270 insertions, 0 deletions
diff --git a/libs/tdlib/td/example/csharp/TdExample.cs b/libs/tdlib/td/example/csharp/TdExample.cs
new file mode 100644
index 0000000000..be98e1a758
--- /dev/null
+++ b/libs/tdlib/td/example/csharp/TdExample.cs
@@ -0,0 +1,270 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+using Td = Telegram.Td;
+using TdApi = Telegram.Td.Api;
+
+using System;
+using System.Threading;
+
+namespace TdExample
+{
+ /// <summary>
+ /// Example class for TDLib usage from C#.
+ /// </summary>
+ class Example
+ {
+ private static Td.Client _client = null;
+ private readonly static Td.ClientResultHandler _defaultHandler = new DefaultHandler();
+
+ private static TdApi.AuthorizationState _authorizationState = null;
+ private static volatile bool _haveAuthorization = false;
+ private static volatile bool _quiting = false;
+
+ private static volatile AutoResetEvent _gotAuthorization = new AutoResetEvent(false);
+
+ private static readonly string _newLine = Environment.NewLine;
+ private static readonly string _commandsLine = "Enter command (gc <chatId> - GetChat, me - GetMe, sm <chatId> <message> - SendMessage, lo - LogOut, q - Quit): ";
+ private static volatile string _currentPrompt = null;
+
+ private static Td.Client CreateTdClient()
+ {
+ Td.Client result = Td.Client.Create(new UpdatesHandler());
+ new Thread(() =>
+ {
+ Thread.CurrentThread.IsBackground = true;
+ result.Run();
+ }).Start();
+ return result;
+ }
+
+ private static void Print(string str)
+ {
+ if (_currentPrompt != null)
+ {
+ Console.WriteLine();
+ }
+ Console.WriteLine(str);
+ if (_currentPrompt != null)
+ {
+ Console.Write(_currentPrompt);
+ }
+ }
+
+ private static string ReadLine(string str)
+ {
+ Console.Write(str);
+ _currentPrompt = str;
+ var result = Console.ReadLine();
+ _currentPrompt = null;
+ return result;
+ }
+
+ private static void OnAuthorizationStateUpdated(TdApi.AuthorizationState authorizationState)
+ {
+ if (authorizationState != null)
+ {
+ _authorizationState = authorizationState;
+ }
+ if (_authorizationState is TdApi.AuthorizationStateWaitTdlibParameters)
+ {
+ TdApi.TdlibParameters parameters = new TdApi.TdlibParameters();
+ parameters.DatabaseDirectory = "tdlib";
+ parameters.UseMessageDatabase = true;
+ parameters.UseSecretChats = true;
+ parameters.ApiId = 94575;
+ parameters.ApiHash = "a3406de8d171bb422bb6ddf3bbd800e2";
+ parameters.SystemLanguageCode = "en";
+ parameters.DeviceModel = "Desktop";
+ parameters.SystemVersion = "Unknown";
+ parameters.ApplicationVersion = "1.0";
+ parameters.EnableStorageOptimizer = true;
+
+ _client.Send(new TdApi.SetTdlibParameters(parameters), new AuthorizationRequestHandler());
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateWaitEncryptionKey)
+ {
+ _client.Send(new TdApi.CheckDatabaseEncryptionKey(), new AuthorizationRequestHandler());
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateWaitPhoneNumber)
+ {
+ string phoneNumber = ReadLine("Please enter phone number: ");
+ _client.Send(new TdApi.SetAuthenticationPhoneNumber(phoneNumber, false, false), new AuthorizationRequestHandler());
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateWaitCode)
+ {
+ string code = ReadLine("Please enter authentication code: ");
+ _client.Send(new TdApi.CheckAuthenticationCode(code, "", ""), new AuthorizationRequestHandler());
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateWaitPassword)
+ {
+ string password = ReadLine("Please enter password: ");
+ _client.Send(new TdApi.CheckAuthenticationPassword(password), new AuthorizationRequestHandler());
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateReady)
+ {
+ _haveAuthorization = true;
+ _gotAuthorization.Set();
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateLoggingOut)
+ {
+ _haveAuthorization = false;
+ Print("Logging out");
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateClosing)
+ {
+ _haveAuthorization = false;
+ Print("Closing");
+ }
+ else if (_authorizationState is TdApi.AuthorizationStateClosed)
+ {
+ Print("Closed");
+ if (!_quiting)
+ {
+ _client = CreateTdClient(); // recreate _client after previous has closed
+ }
+ }
+ else
+ {
+ Print("Unsupported authorization state:" + _newLine + _authorizationState);
+ }
+ }
+
+ private static long GetChatId(string arg)
+ {
+ long chatId = 0;
+ try
+ {
+ chatId = Convert.ToInt64(arg);
+ }
+ catch (FormatException)
+ {
+ }
+ catch (OverflowException)
+ {
+ }
+ return chatId;
+ }
+
+ private static void GetCommand()
+ {
+ string command = ReadLine(_commandsLine);
+ string[] commands = command.Split(new char[] { ' ' }, 2);
+ try
+ {
+ switch (commands[0])
+ {
+ case "gc":
+ _client.Send(new TdApi.GetChat(GetChatId(commands[1])), _defaultHandler);
+ break;
+ case "me":
+ _client.Send(new TdApi.GetMe(), _defaultHandler);
+ break;
+ case "sm":
+ string[] args = commands[1].Split(new char[] { ' ' }, 2);
+ sendMessage(GetChatId(args[0]), args[1]);
+ break;
+ case "lo":
+ _haveAuthorization = false;
+ _client.Send(new TdApi.LogOut(), _defaultHandler);
+ break;
+ case "q":
+ _quiting = true;
+ _haveAuthorization = false;
+ _client.Send(new TdApi.Close(), _defaultHandler);
+ break;
+ default:
+ Print("Unsupported command: " + command);
+ break;
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ Print("Not enough arguments");
+ }
+ }
+
+ private static void sendMessage(long chatId, string message)
+ {
+ // initialize reply markup just for testing
+ TdApi.InlineKeyboardButton[] row = { new TdApi.InlineKeyboardButton("https://telegram.org?1", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?2", new TdApi.InlineKeyboardButtonTypeUrl()), new TdApi.InlineKeyboardButton("https://telegram.org?3", new TdApi.InlineKeyboardButtonTypeUrl()) };
+ TdApi.ReplyMarkup replyMarkup = new TdApi.ReplyMarkupInlineKeyboard(new TdApi.InlineKeyboardButton[][] { row, row, row });
+
+ TdApi.InputMessageContent content = new TdApi.InputMessageText(new TdApi.FormattedText(message, null), false, true);
+ _client.Send(new TdApi.SendMessage(chatId, 0, false, false, replyMarkup, content), _defaultHandler);
+ }
+
+ static void Main()
+ {
+ // disable TDLib log
+ Td.Log.SetVerbosityLevel(0);
+ if (!Td.Log.SetFilePath("tdlib.log"))
+ {
+ throw new System.IO.IOException("Write access to the current directory is required");
+ }
+
+ // create Td.Client
+ _client = CreateTdClient();
+
+ // test Client.Execute
+ _defaultHandler.OnResult(_client.Execute(new TdApi.GetTextEntities("@telegram /test_command https://telegram.org telegram.me @gif @test")));
+
+ // main loop
+ while (!_quiting)
+ {
+ // await authorization
+ _gotAuthorization.Reset();
+ _gotAuthorization.WaitOne();
+
+ _client.Send(new TdApi.GetChats(Int64.MaxValue, 0, 100), _defaultHandler); // preload chat list
+ while (_haveAuthorization)
+ {
+ GetCommand();
+ }
+ }
+ }
+
+ private class DefaultHandler : Td.ClientResultHandler
+ {
+ void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object)
+ {
+ Print(@object.ToString());
+ }
+ }
+
+ private class UpdatesHandler : Td.ClientResultHandler
+ {
+ void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object)
+ {
+ if (@object is TdApi.UpdateAuthorizationState)
+ {
+ OnAuthorizationStateUpdated((@object as TdApi.UpdateAuthorizationState).AuthorizationState);
+ }
+ else
+ {
+ // Print("Unsupported update: " + @object);
+ }
+ }
+ }
+
+ private class AuthorizationRequestHandler : Td.ClientResultHandler
+ {
+ void Td.ClientResultHandler.OnResult(TdApi.BaseObject @object)
+ {
+ if (@object is TdApi.Error)
+ {
+ Print("Receive an error:" + _newLine + @object);
+ OnAuthorizationStateUpdated(null); // repeat last action
+ }
+ else
+ {
+ // result is already received through UpdateAuthorizationState, nothing to do
+ }
+ }
+ }
+ }
+}