Skip to content

Commit

Permalink
Merge pull request #11 from Al-Muhandis/DesignTime
Browse files Browse the repository at this point in the history
Design time
  • Loading branch information
Al-Muhandis authored Dec 5, 2023
2 parents ac30ad3 + 929830e commit bc6d863
Show file tree
Hide file tree
Showing 19 changed files with 1,544 additions and 62 deletions.
67 changes: 33 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,45 @@ Library for working with Telegram bots API in FreePascal/Lazarus

FreePascal wrapper classes for Telegram bot's API. You can use it in your own working projects. Please join if you want to help of the development this library.

The library **does not use any third-party libraries**, besides the built-in FPC. You can use it both independently and together with other libraries, for example, as a plug-in to Brook-framework https://github.com/Al-Muhandis/brook-telegram/

Done:
+ webhook getting updates
+ longpolling getting udates via getUpdates API method
+ Telegram bots API methods implemented:
+ getMe
+ getFile
+ sendMessage
+ sendDocument
+ sendPhoto
+ sendAudio
+ sendVoice
+ sendVideo
+ getUpdates
+ answerInlineQuery
+ answerCallbackQuery
+ sendLocation
+ sendInvoice
+ answerPreCheckOutQuery
+ etc
+ Update events handling
+ All implemented
+ Full json updates logging (without handling)
+ Simple statistcs (csv-format)
+ Isolation of the HTTP client implementation from the interface. Added FCL http client broker (default) and synapse http client broker units
+ HTTP proxy support (still only with the synapse HTTP client broker)

Todo:
+ ~~Extensive statistics~~
+ Other bots API methods
+ ~~Other update events handling~~
+ Please suggest me other functionalities
The library **does not use any third-party libraries**, besides the built-in FPC. You can use it both independently and together with other libraries,
for example, as a [plug-in](https://github.com/Al-Muhandis/brook-telegram/) to Brook-framework/Brook4FreePascal

# Design-time

Library has two packages: run-time (`fptelegram.lpk`) and design-time (`fp-telegram_dt.lpk`). `fp-telegram_dt.lpk` contains component `DTLongPolBot`.
It is ready-made longpolling bot which you can use for the rapid developments of longpolling telegram bots.
Look about longpolling [here](https://github.com/Al-Muhandis/fp-telegram/wiki/How-to-step-by-step.-Creation-telegram-bot-in-Lazarus-(longpolling)).
This component ca be used in GUI and non-GUI applications, daemons and services and
even in web-server (however, in the latter case, it is preferable to use a webhook mechanism to receive updates.
About webhook is [here](https://github.com/Al-Muhandis/fp-telegram/wiki/How-to-step-by-step.-Creation-telegram-bot-in-Lazarus-(webhook))

# Examples
You can find in the `examples` folder various architectures for using the library:
long polling and webhook,
single-threaded and multithreaded,
using the designtime component and runtime classes

***

Библиотека для работы с API ботов в телеграмм

FreePascal библиотека классов для работы с API телеграм-ботов. Вы уже можете использовать его в своих рабочих проектах. Если Вы хотите помочь в развитии проекта - присоединяйтесь!

Библиотека **не использует никаких сторонних библиотек**, кроме встроенных в FPC. Вы можете использовать ее как самостоятельно, так и в составе других библиотек, к примеру, как плагин к Brook-framework https://github.com/Al-Muhandis/brook-telegram/
Библиотека **не использует никаких сторонних библиотек**, кроме встроенных в FPC. Вы можете использовать ее как самостоятельно, так и в составе других библиотек,
к примеру, как [плагин](https://github.com/Al-Muhandis/brook-telegram/) к Brook-framework/Brook4FreePascal

# DesignTime (компонент "времени разработки")

Библиотека содержит два пакета: runtime (`fptelegram.lpk`) и design-time (`fp-telegram_dt.lpk`). `fp-telegram_dt.lpk` содержит компонент `DTLongPolBot`.
Это готовый бот для longpolling ботов, который вы можете использовать для быстрой разработки telegram. О создании longpolling бота,
к примеру [здесь](https://github.com/Al-Muhandis/fp-telegram/wiki/How-to-step-by-step.-Creation-telegram-bot-in-Lazarus-(longpolling)).
Этот компонент может использоваться в приложениях с графическим интерфейсом и без него, демонах и сервисах и
даже на веб-сервере (однако в последнем случае предпочтительнее использовать механизм webhook для получения обновлений.
О таких ботах [здесь](https://github.com/Al-Muhandis/fp-telegram/wiki/How-to-step-by-step.-Creation-telegram-bot-in-Lazarus-(webhook))

# Примеры в папке examples

Вы можете найти в папке `examples` различные архитектуры для использования библиотеки:
длительный опрос и webhook,
однопоточные и многопоточные,
с использованием компонентов runtime и designtime
69 changes: 69 additions & 0 deletions designtime/dttelegrambot.pas
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
unit DTTelegramBot;

{$mode ObjFPC}{$H+}

interface

uses
Classes, SysUtils, tgbot_dt, ComponentEditors
;

type

{ TLPTelegramBotEditor }

TLPTelegramBotEditor = class(TComponentEditor)
private
procedure getMe;
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;

procedure Register;

implementation

uses
LResources
;

procedure Register;
begin
{$I dttelegrambot_icon.lrs}
RegisterComponentEditor(TDTLongPolBot, TLPTelegramBotEditor);
RegisterComponents('Misc', [TDTLongPolBot]);
end;

{ TLPTelegramBotEditor }

procedure TLPTelegramBotEditor.getMe;
begin
(Component as TDTLongPolBot).BotgetMe;
end;

procedure TLPTelegramBotEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: getMe;
else
inherited;
end;
end;

function TLPTelegramBotEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result:='getMe for the bot';
else
inherited;
end;
end;

function TLPTelegramBotEditor.GetVerbCount: Integer;
begin
Result:=1;
end;

end.
148 changes: 148 additions & 0 deletions designtime/dttelegrambot_icon.lrs
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
LazarusResources.Add('TDTLongPolBot','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+#0#0#6'bKGD'#0#0#0#0#0#0#249'C'#187#127#0#0#0#9'pHYs'#0#0'.#'#0#0'.#'#1'x'
+#165'?v'#0#0#2#172'IDATH'#199#173#150'?LSQ'#20#198#127#175'<'#164#20'5'#129
+#22'I'#4'RhA'#227'@'#9'q'#210'`'#4#18'W'#7#249#179#208#18#19#19#145#129#193
+#201#24#19#141'a'#147#193'A'#19#137'a'#208#210#14#10#142#198#200'"'#163'q'
+#192#4#252#23'ik'#17#168' RZJ'#176#148'6'#199#1#168#208#242'J'#249#243#189
+#220#229#156'{'#191#239#228'{'#247#222's'#21'2'#160#250'U'#208#12#216#129#6
+'Pj'#128#146#141#212#28#200'80'#2#184''''#154#139#252'Z'#28#202'N'#193#170
+#161'`'#5#208#163#172#147#239#10#1#23#200'=O'#139#209#183#171'@'#213#208'B;'
+#240#20'0'#176'7'#172#0#157#158#22#163'KS'#160'j'#240'O'''#208#199#193#208
+#229'i5'#245#165#9'X'#7#231#219#21'pq'#8#16#232#240#182#22#15'$'#5#172'/'#127
+'W'#0#159#247'aK&'#187'l'#222#182#19'^'#221#134'f'#15#136#1#132'C'#26#6#144
+#251#0#138#245#197#172#25#20#255'^K'#172#200'U'#232#180#234'9{2'#143#247#211
+'Q'#238'~'#143#238'd'#150'E'#21#176#175#171'f'#135#150'"'#149#230'S'#6#234'J'
+#245#228#230#172#255#194#192'R'#28#217#153#163']E'#164'!'#27#226';'#22'='#151
+#170#12#148#23#30'I'#203#205'.'#199'Av'#20'hT'#17#169#209'"'#181#233'u\'#171
+'6p'#209'j'#224#152'>'#7#128'H4'#193#208#167#8#151#207#28#197'X'#160#2#224#11
+#175'i'#9#216'TAJR'#163'W'#138'ri;]@]Y~'#210#6#128#209#169#21#158#127'Y'#230
+#246#185#194'$9'#192#183#176#166'E&5U'#249#166'YO'#247'y'#227#182'X$'#154#192
+'9'#26'bl1No'#147#137#227#249'9'#201'\,!'#140'D'#226#154#214#170' s[.1'#30'N'
+#254'e)6O}'#169#30#139')'#143#153'P'#140#158#143'K'#148#229#233#232'm*'#222
+'F'#14#16'\'#142#147'a'#147','#168'"'#140'o'#21#0#232#15#172#210#31'X'#221'6'
+#243#209#5'c'#26'9@ '#28#211#176#31#128'1'#29#200'H6'#135#231#193#135' 3'#161
+'X'#26#195#207#240'Z'#166'u'#239't'#136#184#17'a'#183#241'6'#180'F'#253#235
+'Y'#134#191#134#137''''#254#151'<'#17#140'eZ'#231#214#249#237'f'#191' .!'#187
+#239#250'h'#136'['#195#191#152'^\e)'#154#224#205'\Tk'#174#219'o7'#251#20#0
+#243#192#15#11'0~'#200#151']'#237#164#163#210#163#3#152'tT'#250'@:'#15#241
+#178#235#154'tTz'#210#26'N'#185#211'w'#3#228#201#193#138'W'#186#167':,'#143
+'5[f'#185#211#235'@'#232#219'W'#203'T'#232#154#234#176':'#183#6'u'#169#179
+#166':'#172#3#136#216#16'qe'#179#187'6w'#11'"'#181#169#228#154#175#138'M'#148
+'='#155#168#4#218#129'F'#192#6#152'6O(0'#182#241'lqM_'#173#246'iq'#252#3'$D~'
+#146'%.'#24#129#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('TDTLongPolBot_150','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0'$'#0#0#0'$'#8#6#0#0#0#225#0#152#152
+#0#0#0#6'bKGD'#0#0#0#0#0#0#249'C'#187#127#0#0#0#9'pHYs'#0#0'.#'#0#0'.#'#1'x'
+#165'?v'#0#0#4',IDATX'#195#197#152#235'O[e'#28#199'?'#167'='#180'k1'#11'L6'
+#25'B'#185#156#2#147'a'#226'e'#131#185#184'i'#182#189'Y'#156#226'.,18d&['#178
+#140'W'#26'c'#140#151'?'#192#136'/'#28#26#231#27#17#182#197#9#238'b'#198#222
+'h4'#26'o'#212#137#137'S'#18'i'#25#148'n'#131'Q'#176'P'#174#229#208#243#248
+#162#29#177#208#150#211#22#216#247#228'ys'#158#223#243';'#223#243#251'>'#151
+#223#239#145'H'#16#197'_'#250#10#128'*`'#27'P'#2'l'#6#204#225#238#0#208#5't'
+#3#29#192'%'#231#193#204#222'D'#252'Kz'#140#202'.'#140'K'#170#166#214' q2L$'
+#17'8'#16'|'#136'$'#157'u'#30#204#12#166'L'#200#222#246#239'^'#224'}`'#19#169
+#225#31#224'U'#215#161'u'#237'I'#17#178#183#141'X'#129'S'#192#203',/'#154#129
+#19#174'C'#247'O'#233'&do'#29#206#5#218'@'#170'dE :'#129#253#174#234#172#254
+'%'#9#133#201#252#8#228#179#178'p'#3';'#23#146#146'"'#201'x'#173#192#183'@%'
+#171#131'N`'#135#171'z'#253#188'|'#134#136'@'#10'N'#9'A'#165#16#176'J'#237'1'
+'!'#248'8j'#132#148'/'#134#246#2'W'#185'7x'#182#231#240#134'+'#243#132#148#11
+'^'#137'9'#209#181#12'K;'#249'-A'#162#188#167'z'#195'\H2U'#171'A'#136'M+'#161
+'I'#182#17#158#207'0.eW'#138'&j'#0#228#240#236#169'_'#238'_~'#197'ffW'#161
+#133#226#245'&'#140#6#9#165'c'#148#6'w '#222#144'z'#224'3'#185#232#252'`'#129
+'X'#166'UUa1p'#180#196#194#246#2'+'#247#153'#'#214#11'&'#131#132#136'?|K'#209
+#249'AEF'#136#170'T'#137#28#219'hb'#159#221'J'#217#198'5'#24'b'#236#253#158
+#137#185#144'<'#241'q@N'#226#176#4' '#219'(qRY'#195'.%'#157#236#181'rD'#159
+#170#9#210#22'0'#251'utNW'#144'e'#16#165#137#202'r'#252#161't'#182#229'['#177
+#152'"e'#25#155#14#210#252#199#24'O'#23'Xx8'#199'2'#255'~Z'#213'p'#206'j'#186
+#178#27'Y'#8#202#244'X'#214'=`b'#127#137#149#205'9'#150#168#178'8'#220'S'#188
+'q'#205#207#187'['#215'F'#144#1#24#157#10#234'P'#11#128'r'#25#132'9Vo'#154#4
+'o*Vv'#219#173'<'#152'a'#138'j36'#29#228#211#206'Q>'#240#4'h'#221#158#193#227
+'6'#235'"'#155#1#191#10#232'bd'#148'cQ'#175#176#26#249'hO'#22#235#210#229#152
+#163#175#245'O'#241#186'c'#140'qMp'#225#201'L'#30#201#181'D'#181#27#240#235
+#154#208#243'gY'#212#205#193#171'j8'#189#1'&'#163'h?>'#19#164#241#231#17#14
+#255#228#3#4#173'{'#178'b'#146#1#232#243#171'z'#167#168'&'#131#232#2#30']'
+#216#211#171#10'^'#248#197#7#248'8'#158'cfk'#182#153#12#139#17#239'd'#144#134
+#191''''#232'Q5'#10#211'$'#154'vg'#145#151'i'#138#251#149'.'#159'n'#201#174
+#203'B'#208#29#141#208#255'q'#250'V'#128#211#183#22#7#178#161'2sI2s'#154#224
+#170#190'%'#15#224'2'#128#232#8#177'O'#188#253'ug'#134#160#22#255#207#135#199
+#213'D|:'#12#192#165'dw'#232#183#187'''y'#235#155';'#12#141#199#158'#'#183
+#199#212'D\^4'#244#213#216'z'#17#194#145#236'i'#254#185'w'#150#231#218#7#249
+#174#219#31'u'#150#244#143#206#234#245#213#217'Wcs'#26#8#5#171'Q'#144#252'3'
+#24#212'8'#250#155#143'w'#190#30'dx"2"]#'#179':'#189#208'8'#159#194'J'#146't'
+'6\7'#165#132#150#161#0#213#237#3'|'#239#244#163#6#5'7}'#1'>'#185'='#163'g'
+#168'S'#146#196#153#136#20'6'#191#165#239#25#16'W'#238'Q'#198'X'#229'>R'#248
+'UD'#146#239'>R'#208#30'.'#226'V'#27#231#238#146'YTu'#128'8'#1#226#247'd'#183
+#129'$'#218#159' '#142#197'-'#20#243#154'o'#216#128#31'V'#169'P|'#202'S['#228
+'^x'#150'Efv'#181'E'#253' v'#134#202#221#21#141#204'"2Q'#9#133'H)'#253#192#14
+#160'e'#217'+'#17'8'#7'<'#225#169'U'#220'I]'#199#228'5'#185#246#1#239#1#165
+')J'#228#4'^'#243#212#217'/'#167'|aek'#186'a'#20#4'_'#4#234#5'lI'#240'F'#172
+#19'hD2'#156#241#188#164#168':'#236#19'Cn'#147'S'#1#14#0#21'@1'#130'r'#192'x'
+'7'#159'A'#226':'#224#2#28#192#197#155'u'#197#206'D'#252#255#7'|W'#184'Y'#158
+#25#246'?'#0#0#0#0'IEND'#174'B`'#130
]);
LazarusResources.Add('TDTLongPolBot_200','PNG',[
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0'0'#0#0#0'0'#8#6#0#0#0'W'#2#249#135
+#0#0#0#6'bKGD'#0#0#0#0#0#0#249'C'#187#127#0#0#0#9'pHYs'#0#0'.#'#0#0'.#'#1'x'
+#165'?v'#0#0#5#141'IDATh'#222#205#154'mLSW'#24#199#127#183'\JiU'#132#241'b'
+#144#130#208'"l'#130#24'u'#195'mq/'#238#195#222#204'> 2'#16'A'#227#22#157'&f'
+'Y'#182#24#151'0'#183'EM'#212'e'#217'2M'#156'qF'#130'd'#190#127'Xf'#178'd'
+#201'6c'#166'S|'#27#11'd.'#128#20#219'A'#160#200#171#180#149#182#156'}h7A*m/'
+'m'#215#127#211'/'#247'>'#231#156#255#255'>'#207'9'#231'9'#207#189#18'!@'#238
+#217#254#185#192#243#192#211#192'B '#13'0'#2'1^'#19'7'#208#10'X'#129'F'#224
+'2p'#190'eU'#162'e'#186'cK'#202'I'#247'%'#3#213#192#26'`'#137#194'nn'#2#199
+#129#163'-'#171#146'z#" '#247'L'#223#28#160#6#216#0#196#19#26'8'#128'Z`WKi'
+#210#223'a'#17'`<'#219#167'F'#136'm m'#7't'#132#7'6'#16#251'$'#164#189'-'#165
+'I'#142#144#9'0'#158#185#155#15#156#244#198'w$'#208#4#148#183#150'>'#214#236
+#207'P'#21#0#249#18#224'z'#4#201#3#20#0#13#198'3w'#203#167#229#1#227#233#222
+#141#192'!'#254'_ln]'#157#252'u'#208#2#162#132#188'_'#17#146'o'#242#214#18
+#224','#209#133#138#214#213')'''#252#10'0'#156#182#230'{c^'#27'e'#2'l@q'#219
+#234#148#166'G'#10'0'#158#238'Q'#11'!]'#141#240#132#13#6#205' '#150#182#149
+#165':|'#174'BB'#176#13#196'B'#16'D'#233#127#1#176#221#167#7#12#167'z'#230'x'
+#243#21#29#209#13';0'#191#173','#213'2'#209#3'B'#212' '#132#14'!'#136#242#127
+'<B'#236#152#224#1#195#201#238'd'#224'N'#8's'#155#128#144#168#130#13#250'8'
+#10'Sb'#177#12#187#169#249#203#30'h'#211#251#128#190#237#205'4'#171#12' '#16
+#213#145'$_'#153#18#203#202#156'x'#22#206#213#160#145#31#172'#'#223#155#239
+'s'#217#230#14#164#139'8'#224'-`'#143#236#189#176'&'#220#164#231#197'Jl'#204
+#209#176'|^<'#233#9#177'>mb'#130#203#141'+'#128'=R'#206#137#174#185' Y'#194
+'E'#252#181#217'1'#148#207#215#178'$#'#30'M'#236#212#12#13''''#187#131#236']'
+'d'#202#192#11#158'%*'#180'x/3'#142'Wsu'#24#146#213#1#217#247#217#220'('#224
+#241#146#12','#11#21'i'#163'Zb'#179'Q'#203's9Z'#146't1>mF'#238#143#161#139
+#155#156#4#15';'#220'J'#134','#150'='#27#215#244#240'r'#130'LU'#158#150#197
+'z-q'#178#239'0'#233#183#185'9zc'#144#140#153'1'#148#21'%L'#186'o'#189#231'R'
+#226#129'"'#25'A'#154'R'#226'[2'#226'X9_G^j'#220#148'v'#23'o'#143#176#227#230
+'0'#175#167#169'))'#156#229#211#198'2'#232'R'#18#201#233#178'@'#24#131'i'#145
+'%Kl'#201#213#242#162'AG'#242#12'yJ'#219'~'#155#139#131'W'#7#248#166'k'#148
+#15#230'i'#216#248'T"'#178#202#183#135#204#195'.D'#240#10#178#228'q'#165#143
+')'#177'\'#23#195#219'O'#232'x2S'#139'&'#214#239'A'#142'K'#237'#'#212#220#24
+#194#228#20#236#204#211'R'#177'h6'#170')'#22#161'[C.EQ '#7'bt'#160'h&'#175
+#228#207#156#146#192#191#24#176#185'9t'#173#159'C'#157#163#0#236'{\G'#169#143
+#152#31#143'1'#1'?'#12'('#21' '#132#219#159#23#10#210#226#2'"'#223'`'#26#225
+#195'k'#131#180';='#161#240'e'#225#12#222'(H'#240#219#206':'#236#244#228'9'
+#10'='#208#10#228'Me'#180#226'G+'#239'gi('#206#136'''?M'#131'V=1'#132#6#236
+'nj'#175#15#240#149#249'A%'#164'~'#217'l'#158#201#14','#177#237#30'v)]G:d'#16
+'='#254#4#140#9#248#204'd'#7#147#29#1#172'MU'#179'8EM'#250#172'X'#254#236#189
+#207#225'v;]'#174#7'O'#240#212#179#137','#205#12'<+'#239#26'r'#162'p3'#237
+#146#133#224#15'`y0'#173#234#187'G'#169#239#30#245'y'#239#139#194#25'A'#145#7
+'h'#31't*'#141#160'F'#21#136#203#161'<5ieU'#208','#154#251#157'J'#199#187#162
+#2#206#135'2'#7'z'#247#247'A.'#180#14#7'l'#239#26#19#156#235'w*'#29#238''''
+#149#169'2'#211#130#167'J'#28#18'8'#4#172'k'#24'`'#215'/='#244#219#252'O'#206
+#158'!'#197#228#155'L'#149#153'wT'#222#227#228#183#161'>'#250#29#233't'#176
+#234'\'#23#191#181#223#155'z'#22#14':'#149#142'q|'#252#153#184#22'O'#137';'
+#164'hw'#10#214'\'#234#227#243#11'='#12'<'#194#27#166#129'Q%]'#143'"q'#248'?'
+#1#166#181'Y'#189#2'Q+'#8#207'o'#191#217'N'#201#185'N'#26'L'#147#189'q'#161
+#211#174#164#207'c'#166#202','#235#195'u'#161#157#222#234'WXp'#219')('#187'x'
+#151#253#191#246#208#237#141#251#171#29#247#248#174'/'#232'9'#224#240'r'#157
+'\'#153#203':'#214#254'1'#240'I$'#14#246#2#197#239#183'vwTe'#215#248#172#204
+'I'#176#23#207#203#133#176'C!'#249'['#192#238#241#23'&'#8'0Ue;'#144'('#15'g('
+'M'#179#184'['#222'Q'#149'm'#127#164#0#128#142#181#217#205' 6Da]tSGUvc'#192
+#158#212#215#221'~'#7'8'#24'%O'#127#171#185':'#231'@'#208#161#168#175'k'#139
+#6#17'['#205#213#134#3#138#231#146#190#174#173#28'8B'#228'_x'#216#128'M'#230
+'jC'#253#180#23#3'}]['#1'B'#156#0#22'D'#136#252'-$'#169#220'\mh'#244'g'#24'P'
+#238'k'#174'64I'#130#165#8'>E`'#15#227'\u '#216#141'`q '#228#21'-'#199#250
+#218#214#12#224'#'#16#235#188'U'#226'P`'#20#164'c'#192'N'#243'zcG'#4#246#19
+#200#168'mI'#193#243#189'D'#5'P'#164'4%'#198#243#177#199'a'#203#250'\k'#4'7'
+#196'Ib'#244#8'V'#0#197#192'" '#29#200'z'#200#236#14#208#9'4"q'#5#248#217#178
+'>'#183'c'#186'c'#255#3#131#189'1KEW+'#231#0#0#0#0'IEND'#174'B`'#130
]);
Loading

0 comments on commit bc6d863

Please sign in to comment.