GithubHelp home page GithubHelp logo

raremaxim / cloudapi Goto Github PK

View Code? Open in Web Editor NEW
119.0 33.0 36.0 16.96 MB

Library for working with many API in Delphi

Home Page: https://t.me/CloudAPI

License: Other

Batchfile 0.97% Pascal 99.03%
telegram-bot delphi standwithukraine

cloudapi's People

Contributors

andb24 avatar keyoff7 avatar phatok avatar raremaxim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cloudapi's Issues

Demos

The demos are not complete.
Plz fill the empty places . And make more clear how to use the demo program.

required DJSON_Project not found

I downloaded TelegAPI and tried to complile it by hitting F9, but Delphi told me that the DJSON_Project package could not be found. Google didn't help me, so I wanted to ask, where do I get this DJSON_Project from?

Lazarus?

Нет ли у Вас мыслей портировать для Lazarus

В деструкторе TTgMessage отсутствует free для SuccessfulPayment?

class:
...
[Alias('successful_payment')]
SuccessfulPayment: TtgSuccessfulPayment;
end;
.....
destructor TtgMessage.Destroy;
begin
FreeAndNil(From);
FreeAndNil(Chat);
FreeAndNil(ForwardFrom);
FreeAndNil(ForwardFromChat);
FreeAndNil(ReplyToMessage);
FreeAndNil(Audio);
FreeAndNil(Document);
FreeAndNil(Sticker);
FreeAndNil(Video);
FreeAndNil(Voice);
FreeAndNil(Contact);
FreeAndNil(Location);
FreeAndNil(Venue);
FreeAndNil(LeftChatMember);
FreeAndNil(PinnedMessage);
FreeAndNil(ForwardFromChat);
FreeAndNil(NewChatMember);
FreeAndNil(NewChatMembers);
FreeAndNil(Photo);
FreeAndNil(Entities);
FreeAndNil(NewChatPhoto);
FreeAndNil(Game);
inherited Destroy;
end;

Access Violation in Deserialize JSON

i installed this package today and ran the EchoBot demo
but when i send /help to bot , most of the time bot is crashed and log :
Access violation at address 004080F2 in module 'EchoBot.exe'. Read of address 40878908

i trace the code and find a clue
program crashed in function TTelegramBot.ParamsToFormData at line 1837 LTest := dj.From(LParameter.Value, TJsonUtils.DJsonConfig(True)).ToJson;
but when i trace more i seen the main problem
you used DJSON written by @mauriziodm , in line DJSON.pas in function TdjValueDestination.ToJSON: String; line 885 Result := FParams.GetEngineClass.Serialize(FValue, nil, FParams); crash point is here
i just fixed it with change function TdjValueDestination.ToJSON: String; and add sleep(500) to function

function TdjValueDestination.ToJSON: String;
begin
  try
    sleep(500);
    Result := FParams.GetEngineClass.Serialize(FValue, nil, FParams);
  finally
    Self.Free;
  end;
end;

Way to detect if someone joins a group?

Not an issue

Expected behavior

Sends a message as soon as someone joins a group where the bot is in.

Actual behavior

Does nothing.

Steps to reproduce the behavior

I'm not sure how I can do this. Any ideas?

Параметры функции EditMessageReplyMarkup взаимоисключают друг друга.

Все параметры этой функции перекрывают друг друга:

/// <param name="ChatId">
///   Required if InlineMessageId is not specified. Unique identifier for <br />
///    the target chat or username of the target channel (in the format <br />
///    @channelusername) <br />
/// </param>
/// <param name="MessageId">
///   Required if InlineMessageId is not specified. Unique identifier of <br />
///    the sent message <br />
/// </param>
/// <param name="InlineMessageId">
///   Required if ChatId and MessageId are not specified. Identifier of <br />
///    the inline message <br />
/// </param>

Поэтому имеет смысл сделать три перегрузки этой фукнции, по одной на каждый параметр.

Задержка завершения потока чтения обновлений.

Сейчас выполнение треда обновления имеет как минимум три узких места, из-за которого его завершение может приводить к долгому ожиданию и даже Access Violation.

Предлагаю оптимизировать выполнение предусловием, вместо постусловия, а также с помощью Queue. Разумеется, этот вариант не предел мечтаний и его нужно тщательно проверить, но часть проблем он решает.

procedure TtgRecesiver.Execute;
var
  LUpdates: TArray<TtgUpdate>;
begin
  if Assigned(Bot.OnConnect) then
    Bot.OnConnect(Bot);
  repeat
    try
      LUpdates := FBot.GetUpdates(Bot.MessageOffset, 100, 0, UPDATES_ALLOWED_ALL);
    except
      on E: Exception do
        FBot.ErrorHandler(E);
    end;
    if Length(LUpdates) > 0 then
    begin
      Bot.MessageOffset := LUpdates[High(LUpdates)].Id + 1;
      if Terminated then Exit;
      TThread.Queue(nil,
        procedure
        var
          I: Integer;
        begin
          for I := Low(LUpdates) to High(LUpdates) do
            Self.OnUpdateReceived(LUpdates[I]);
          if Assigned(LUpdates) then
          begin
            for I := Low(LUpdates) to High(LUpdates) do
              FreeAndNil(LUpdates[I]);
            LUpdates := nil;
          end;
        end);
      end;
      Sleep(Bot.PollingTimeout);
  until (Terminated) or (not Bot.IsReceiving);
end;

Баг в функции EditMessageReplyMarkup

Функция EditMessageReplyMarkup вызывает на самом деле метод editMessageText.

function TTelegramBot.EditMessageReplyMarkup(ChatId: TValue; MessageId: Integer; ReplyMarkup: TtgReplyKeyboardMarkup): Boolean;
var
  Parameters: TDictionary<string, TValue>;
begin
  Parameters := TDictionary<string, TValue>.Create;
  try
    Parameters.Add('chat_id', ChatId);
    Parameters.Add('message_id', MessageId);
    Parameters.Add('reply_markup', ReplyMarkup);
    Result := API<Boolean>('editMessageText', Parameters);
  finally
    Parameters.Free;
  end;
end;

Problem to retrive information with Bot Component

Hello good afternoon, install the component without problems, using a form I use TelegramBot1, including the Token of my BOT, I put the following code and send me Error, could you use an example of how to use a simple form to send a message to a group? Having already the group ID

Try to attach sample but i cant

My simple code

unit Unit1;
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, TelegAPI.Bot;

type
  TForm1 = class(TForm)
    Button1: TButton;
    TelegramBot1: TTelegramBot;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
XSuperObject;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
ShowMessage(TelegramBot1.getMe.Username);
except
ShowMessage('Error');
end;
TelegramBot1.Free;
end;

end.

Пример не работает

/help
SendDataToServer@Access violation at address 0045C6DC in module 'EchoBot.exe'. Read of address FFFFFFB9
RequestAPI@Can't parse response

Круто

Все работает!!! Спасибо

Асинхронное получение обновлений

Сейчас получение обновлений выполняется синхронно, каждый раз требующее сначала обработать все обновления предыдущего этапа, прежде чем произойдёт чтение следующего. Если выполнение любого действия займёт достаточно много времени, то это время придётся ждать всем пользователям бота, прежде чем он отреагирует на их запрос.

В Indy, к примеру, все запросы в серверные компоненты (IdHTTPServer, например) потоконебезопасные именно по этой причине - чтобы обработка была максимально быстрой. Если нужно обновить элементы UI, то лучше использовать TThread.Synchronize. Но в случае с ботом гораздо практичнее запускать его в консоли или службе, поэтому требования к потокобезопасности заметно ниже.

Сейчас потоконебезопасный обработчик закрыт в {$IF Defined(NO_QUEUE)}, но куда эффективнее было бы завести свойство Async в родительском компоненте, в зависимости от значения которого будет выбираться первый или второй обработчик.

Пример (учитывая, что FASync выведено в переменные потока):

procedure TtgRecesiver.Execute;
var
  LUpdates: TArray<TtgUpdate>;
  I: Integer;
begin
  if Assigned(Bot.OnConnect) then
    Bot.OnConnect(Bot);
  repeat
    try
      LUpdates := FBot.GetUpdates(Bot.MessageOffset, 100, 0, Bot.AllowedUpdates);
    except
      on E: Exception do
        FBot.ErrorHandler(E);
    end;
    if Length(LUpdates) > 0 then
    begin
      Bot.MessageOffset := LUpdates[High(LUpdates)].ID + 1;

      for I := Low(LUpdates) to High(LUpdates) do
      begin
        if FASync then
          Self.OnUpdateReceived(LUpdates[I])
        else
          TThread.Synchronize(nil,
            procedure
            begin
              Self.OnUpdateReceived(LUpdates[I]);
            end);
        FreeAndNil(LUpdates[I]);
      end;
    end;
    Sleep(Bot.PollingTimeout);
  until (Terminated) or (not Bot.IsReceiving);
end;

+Методы и Флажок активности

Предлагаю добавить методы START и STOP.
Длинное слово ISReceiving, означающее "приём, принимаю" заменить на Active.
Бот ещё же и отправляет инфу.

пример кода:
form.OnDestroy;
begin
...
if tgBot.Active then tgBot.Stop;
...
end;

Сравните с тем, что сейчас:
if tgBot.isReceiving then tgBot.isReceiving:=false;

problem with json package

unfortunately, There is some issue on JsonDataObjects.TJsonDataValue class, and we can not to use this package

Экземпляр клавиатуры не может быть создан пустым

Для динамического создания клавиатур имеет смысл создать прототип конструктора, не требующий обязательной передачи массива клавиш или готовой клавиатуры. Сейчас можно вызвать его с пустым значением, но это приведёт к Access Violation.

Чтобы удобно использовать конструкции вроде такой:

  Keyboard := TtgReplyKeyboardMarkup.Create(True, False);
  with Keyboard do
  begin
    AddRow([...]);

...cледует расширить перегрузки конструкторов клавиатур:

constructor TtgReplyKeyboardMarkup.Create(AResizeKeyboard, AOneTimeKeyboard: Boolean);
begin
  inherited Create;
  ResizeKeyboard := AResizeKeyboard;
  OneTimeKeyboard := AOneTimeKeyboard;
end;
constructor TtgInlineKeyboardMarkup.Create;
begin
  inherited Create;
end;

Lazarus

Нет ли у Вас мыслей портировать для Lazarus?

Утечка памяти после выполнения запросов на сервер

Максим, здравствуйте!
Хочется сказать спасибо, за библиотеку TelegramBot для Delphi.
Классная вещь! А вы отмечали что происходит утечка памяти если зациклить методы getUpdates или getMe? Все что подхватывает TelegramBot.API
(с) Roman Chaplyankov

Listening thread exits after connection down

Bot stops the listening thread if the connection to the Internet is broken. This causes the OnDisconnect event to be raised. It would be correct to allow users to decide whether to stop receiving messages inside the OnDisconnect event handler or continue listening until the connection is restored.

Не работает метод SendVideo

Вызываю метод, аналогично SendFoto в примерах: tgBot.SendVideo(theChatID,TtgFileToSend.FromFile('c:\testmp4\test.mp4'));
Получаю: OnGlobalException: RequestAPI@Could not convert variant of type (UnicodeString) into type (Double)

vpn network

helo, i have problem if my network on vpn.
error message like this:
error Execution of request terminated with unknown error

but if my network not in vpn telegAPI goes well.

how to resolve error?

Расширения Demo - Echobot

Желательно, чтобы демо Echobot было полноценное и демонстрировала использование всех доступных методов, который предоставляет tgBot....

Чат ID определяется неверно

Chat ID при компиляции бота под win32 или win64 определяется неверно, как 32-битный integer вместо int64.
Ошибка в функции

TdjEngineJDO.DeserializeInt(const AJSONValue: PJsonDataValue;  const AValueType: TRttiType): TValue;
begin
  if not Assigned(AJSONValue) or (AJSONValue.Typ = TJsonDataType.jdtNone)  then
    Result := 0
  else
_// нужно так:_
    **If AValueType.TypeKind=tkInt64 then Result := AJSONValue.LongValue** else Result := AJSONValue.IntValue;
end;

Кроме того, при компиляции под win64 ошибка в TdjEngineJDO.DeserializeArray. Нужно задавать LArrayLen: nativeint; вместо LArrayLen: Longint;

SendDocument присылает tmp

В методе SendDocument при отправке файла из потока, например html из TStringStream нужно сохранить имя файла, чтобы на принимающей стороне пришел файл именно с заданным именем и расширением. В конструкторе Create для поточных файлов нужно тоже задавать FileName.
image а потом подсовывать его вместо имени временного файла при вызове API SendDocument.

Where's token.inc

The Demo program uses the token.inc that wasn't in the project. Can you attach the file please?
Thanks in advance

Failed editing GUI in EchoBot.Main.fmx

I've tried TelegAPI and I am excited so far. Good job.
But there is one thing I still dont get: When I choose "EchoBot.exe" and compile it, it runs without problems, also editing the source code to send/receive different stuff works fine, but when I try to edit the GUI (by clicking on the EchoBot.Main.fmx inside the projectmanager) then it throws an error like this:
Class TTelegramBot not found. Ignore the Error and continue? WARNING: Ignoring the error may result in components or propertys getting lost/deleted. [ignore] [abort] [ignore all]

If I click on [ignore] it comes up with another error, saying the class "TTgBotRecesiverUI" is missing too - so same error with another class.
If I ignore the warnings I can edit the fmx GUI controls, but then some (many) things in the source code won't work of course and if I abort the error(s), then I can't edit the GUI.

So my question is:
Where do I get these missing classes class from? Or how can I otherwise edit the GUI by ensuring the code will still work?

Функция временого бана

Добавить новые методы

  1. restrictChatMember
  2. promoteChatMember

для управления пользователями и админами

Добавить новый параметр until_date в метод kickChatMember для бана по времени

Функции с инлайн-клавиатурой в параметрах содержит маркап-клавиатуру.

EditMessageReplyMarkup, SendPhoto и другие функции имеют тип параметра "ReplyMarkup: TtgReplyKeyboardMarkup", тогда как по логике должны быть TtgInlineKeyboardMarkup. Простая замена типа параметра - и функция начинает работать правильно, выводя клавиатуру.

Неплохо было бы вообще привести тип к интерфейсному IReplyMarkup, но нужно быть осторожным, во избежание ошибок "Invalid pointer operation".

Не работает внутри DLL

Пытаюсь использовать внутри DLL, ошибок никаких не выдаёт, но процедура, в которой должны обрабатываться получаемые ботом сообщения, просто не вызывается. Демки работают корректно.

Cant install/compile XE7

When i try to compile/install the install dpk i get the following error

[dcc32 Fataler Fehler] TelegAPI.Bot.pas(11): F1026 Datei nicht gefunden: 'C:\delphilib\Telegram\TelegAPI-master\Install\System.Net.Mime.dcu'
bds_2016-12-13_11-02-32

Функция EditMessageCaption должна быть разделена на две

Параметр InlineMessageId в функции должен задаваться только при отсутствии ChatId и MessageId, иначе приводит к ошибке 400. Нужно создать два overload варианта.

Полагаю, та же проблема у всех функций с параметром InlineMessageId.

Новые поля для ChatMember

Добавить новые поля

  1. until_date
  2. can_be_edited
  3. can_change_info
  4. can_post_messages
  5. can_edit_messages
  6. can_delete_messages
  7. can_invite_users
  8. can_restrict_members
  9. can_pin_messages
  10. can_promote_members
  11. can_send_messages
  12. can_send_media_messages
  13. can_send_other_messages
  14. can_add_web_page_previews

в ChatMember.

Метод SendMessage не отправляет сообщение в публичный канал

Есть публичный канал, мой бот (TelegaPi) добавлен как администратор канала и имеет все привилегии, бот пытается послать сообщение в канал, но получает:
OnApiException: TTelegramBot.ApiTest@EApiRequestException:
ErrorCode = 0. Message = {"ok":false,"error_code":400,"description":"Bad Request: chat not found"}

Хотя, скажем на версии Bot API: 3.3.0 отправка сообщения в публичный канал работала.

Метод вызывался так:
tgBot.SendMessage('-999999','Test Message');
где -999999 - это ID публичного канала

Ошибка "brcc32 exited with code 9009" при сборке bpl.

На компьютерах, где по какой-то причине каталог Bin от Delphi не попал в переменную Path, при попытке собрать пакет появляется ошибка "brcc32 exited with code 9009", после чего сборка завершается. Причина в командах "до сборки", где brcc32 вызывается без пути к файлу. Чтобы проект успешно собирался, предлагаю заменить команду на полный прототип:

"$(BDS)\Bin\brcc32.exe" -fo "$(PROJECTDIR)\TTelegramBot.dcr" "$(PROJECTDIR)\TTelegramBot.rc"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.