Skip to content

Commit c407d3d

Browse files
committed
add style
Add style field support for keyboard buttons
1 parent 729cf5d commit c407d3d

File tree

3 files changed

+149
-83
lines changed

3 files changed

+149
-83
lines changed

fptelegram.lpk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
</CompilerOptions>
2424
<Description Value="Telegram bots API library"/>
2525
<License Value="MIT License"/>
26-
<Version Release="10"/>
26+
<Version Release="11"/>
2727
<Files Count="6">
2828
<Item1>
2929
<Filename Value="tgsendertypes.pas"/>

test/testtelegram.pas

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ TTestReactionUpdates=class(TTestCase)
8585
procedure ParseMessageReactionCountUpdate;
8686
end;
8787

88+
{ TTestSenderTypes }
89+
90+
TTestSenderTypes=class(TTestCase)
91+
published
92+
procedure KeyboardButtonsStyle;
93+
end;
94+
8895
{ TTestReceiveLongPollingBase }
8996
{ Test receiving updates via longpolling from the test bot. Please send test messages to the bot
9097
immediately before running the test! }
@@ -467,6 +474,38 @@ procedure TTestMessageQuote.ParseMessageExternalReply;
467474
end;
468475
end;
469476

477+
{ TTestSenderTypes }
478+
479+
procedure TTestSenderTypes.KeyboardButtonsStyle;
480+
var
481+
aReplyMarkup: TReplyMarkup;
482+
aReplyButtons: TKeyboardButtons;
483+
aInlineButtons: TInlineKeyboardButtons;
484+
aReplyButton: TKeyboardButton;
485+
aInlineButton: TInlineKeyboardButton;
486+
begin
487+
aReplyMarkup:=TReplyMarkup.Create;
488+
try
489+
aReplyButtons:=aReplyMarkup.CreateReplyKeyboard.Add;
490+
aReplyButton:=TKeyboardButton.Create('Reply button');
491+
aReplyButton.Style:='primary';
492+
aReplyButtons.Add(aReplyButton);
493+
494+
aInlineButtons:=aReplyMarkup.CreateInlineKeyBoard.Add;
495+
aInlineButton:=TInlineKeyboardButton.Create('Inline button');
496+
aInlineButton.Callback_Data:='cb';
497+
aInlineButton.Style:='secondary';
498+
aInlineButtons.Add(aInlineButton);
499+
500+
AssertEquals('primary', aReplyButton.Style);
501+
AssertEquals('secondary', aInlineButton.Style);
502+
AssertTrue('Reply keyboard JSON should contain style', Pos('"style" : "primary"', aReplyMarkup.AsJSON)>0);
503+
AssertTrue('Inline keyboard JSON should contain style', Pos('"style" : "secondary"', aReplyMarkup.AsJSON)>0);
504+
finally
505+
aReplyMarkup.Free;
506+
end;
507+
end;
508+
470509
{ TTestSender }
471510

472511
procedure TTestSender.SetUp;
@@ -794,6 +833,6 @@ procedure TTestSender.getChatAdministators;
794833

795834
initialization
796835
RegisterTests([TTestSender, TTestSenderProcedure, TTestProxySender, TTestReceiveLongPolling,
797-
TTestPayments, TTestReactionUpdates, TTestMessageQuote]);
836+
TTestPayments, TTestReactionUpdates, TTestMessageQuote, TTestSenderTypes]);
798837

799838
end.

tgsendertypes.pas

Lines changed: 108 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ TInlineKeyboard = class;
3232
TInlineQueryEvent = procedure (ASender: TObject; AnInlineQuery: TTelegramInlineQueryObj) of object;
3333
TChosenInlineResultEvent = procedure (ASender: TObject;
3434
AChosenInlineResult: TTelegramChosenInlineResultObj) of object;
35-
TPreCheckoutQueryEvent = procedure (ASender: TObject;
36-
APreCheckoutQuery: TTelegramPreCheckOutQuery) of object;
37-
TSuccessfulPaymentEvent = procedure (ASender: TObject;
38-
ASuccessfulPayment: TTelegramSuccessfulPayment) of object;
39-
TMessageReactionEvent = procedure (ASender: TObject;
40-
AMessageReaction: TTelegramMessageReactionUpdated) of object;
41-
TMessageReactionCountEvent = procedure (ASender: TObject;
42-
AMessageReactionCount: TTelegramMessageReactionCountUpdated) of object;
35+
TPreCheckoutQueryEvent = procedure (ASender: TObject;
36+
APreCheckoutQuery: TTelegramPreCheckOutQuery) of object;
37+
TSuccessfulPaymentEvent = procedure (ASender: TObject;
38+
ASuccessfulPayment: TTelegramSuccessfulPayment) of object;
39+
TMessageReactionEvent = procedure (ASender: TObject;
40+
AMessageReaction: TTelegramMessageReactionUpdated) of object;
41+
TMessageReactionCountEvent = procedure (ASender: TObject;
42+
AMessageReactionCount: TTelegramMessageReactionCountUpdated) of object;
4343

4444
{ TStringHash }
4545

@@ -108,13 +108,16 @@ TKeyboardButton = class(TJSONObject)
108108
private
109109
function GetRequestContact: Boolean;
110110
function GetRequestLocation: Boolean;
111+
function GetStyle: String;
111112
function Gettext: String;
112113
procedure SetRequestContact(AValue: Boolean);
113114
procedure SetRequestLocation(AValue: Boolean);
115+
procedure SetStyle(const AValue: String);
114116
procedure Settext(AValue: String);
115117
public
116118
constructor Create(const AText: String);
117119
property text: String read Gettext write Settext;
120+
property Style: String read GetStyle write SetStyle; // Optional
118121
property RequestContact: Boolean read GetRequestContact write SetRequestContact; // Optional
119122
property RequestLocation: Boolean read GetRequestLocation write SetRequestLocation; // Optional
120123
end;
@@ -142,16 +145,19 @@ TInlineKeyboardButton = class(TJSONObject)
142145
function Getcallback_data: String;
143146
function Getswitch_inline_query: String;
144147
function Getswitch_inline_query_current_chat: String;
148+
function GetStyle: String;
145149
function Gettext: String;
146150
function Geturl: String;
147151
procedure Setcallback_data(AValue: String);
152+
procedure SetStyle(AValue: String);
148153
procedure Setswitch_inline_query(AValue: String);
149154
procedure Setswitch_inline_query_current_chat(AValue: String);
150155
procedure Settext(AValue: String);
151156
procedure Seturl(AValue: String);
152157
public
153158
constructor Create(const AText: String);
154159
property text: String read Gettext write Settext;
160+
property Style: String read GetStyle write SetStyle;
155161
property url: String read Geturl write Seturl;
156162
property callback_data: String read Getcallback_data write Setcallback_data;
157163
property switch_inline_query: String read Getswitch_inline_query write Setswitch_inline_query;
@@ -454,10 +460,10 @@ TTelegramSender = class
454460
FOnReceiveEditedChannelPost: TMessageEvent;
455461
FOnReceiveEditedMessage: TMessageEvent;
456462
FOnReceiveInlineQuery: TInlineQueryEvent;
457-
FOnReceiveMessage: TMessageEvent;
458-
FOnReceiveMessageReaction: TMessageReactionEvent;
459-
FOnReceiveMessageReactionCount: TMessageReactionCountEvent;
460-
FOnReceiveMyChatMemberUpdated: TChatMemberEvent;
463+
FOnReceiveMessage: TMessageEvent;
464+
FOnReceiveMessageReaction: TMessageReactionEvent;
465+
FOnReceiveMessageReactionCount: TMessageReactionCountEvent;
466+
FOnReceiveMyChatMemberUpdated: TChatMemberEvent;
461467
FOnReceivePreCheckoutQuery: TPreCheckoutQueryEvent;
462468
FOnReceiveSuccessfulPayment: TMessageEvent;
463469
FUpdate: TTelegramUpdateObj;
@@ -528,14 +534,14 @@ TTelegramSender = class
528534
procedure DoReceiveCallbackQuery(ACallback: TCallbackQueryObj); virtual;
529535
procedure DoReceiveChannelPost(AChannelPost: TTelegramMessageObj); virtual;
530536
procedure DoReceiveEditedChannelPost(AChannelPost: TTelegramMessageObj); virtual;
531-
procedure DoReceiveInlineQuery(AnInlineQuery: TTelegramInlineQueryObj); virtual;
532-
procedure DoReceiveChosenInlineResult(AChosenInlineResult: TTelegramChosenInlineResultObj); virtual;
533-
procedure DoReceivePreCheckoutQuery(APreCheckoutQuery: TTelegramPreCheckOutQuery); virtual;
534-
procedure DoReceiveMyChatMemberQuery(AMyChatMember: TTelegramChatMemberUpdated); virtual;
535-
procedure DoReceiveChatMemberQuery(AChatMember: TTelegramChatMemberUpdated); virtual;
536-
procedure DoReceiveMessageReaction(AMessageReaction: TTelegramMessageReactionUpdated); virtual;
537-
procedure DoReceiveMessageReactionCount(AMessageReactionCount: TTelegramMessageReactionCountUpdated); virtual;
538-
procedure DoReceiveSuccessfulPayment(AMessage: TTelegramMessageObj); virtual;
537+
procedure DoReceiveInlineQuery(AnInlineQuery: TTelegramInlineQueryObj); virtual;
538+
procedure DoReceiveChosenInlineResult(AChosenInlineResult: TTelegramChosenInlineResultObj); virtual;
539+
procedure DoReceivePreCheckoutQuery(APreCheckoutQuery: TTelegramPreCheckOutQuery); virtual;
540+
procedure DoReceiveMyChatMemberQuery(AMyChatMember: TTelegramChatMemberUpdated); virtual;
541+
procedure DoReceiveChatMemberQuery(AChatMember: TTelegramChatMemberUpdated); virtual;
542+
procedure DoReceiveMessageReaction(AMessageReaction: TTelegramMessageReactionUpdated); virtual;
543+
procedure DoReceiveMessageReactionCount(AMessageReactionCount: TTelegramMessageReactionCountUpdated); virtual;
544+
procedure DoReceiveSuccessfulPayment(AMessage: TTelegramMessageObj); virtual;
539545
procedure DoReceiveBusinessConnection(ABusinessConnection: TTelegramBusinessConnectionObj); virtual;
540546
procedure DoReceiveBusinessMessage(ABusinessMessage: TTelegramMessageObj); virtual;
541547
procedure DebugMessage(const Msg: String); virtual; // it will send all requests and responses to the log. Useful during development
@@ -744,20 +750,20 @@ TTelegramSender = class
744750
write FOnReceiveInlineQuery;
745751
property OnReceiveChosenInlineResult: TChosenInlineResultEvent read FOnReceiveChosenInlineResult
746752
write FOnReceiveChosenInlineResult;
747-
property OnReceivePreCheckoutQuery: TPreCheckoutQueryEvent read FOnReceivePreCheckoutQuery
748-
write FOnReceivePreCheckoutQuery;
749-
property OnReceiveSuccessfulPayment: TMessageEvent read FOnReceiveSuccessfulPayment
750-
write FOnReceiveSuccessfulPayment;
751-
property OnReceiveBusinessConnection: TBusinessConnectionEvent read FOnReceiveBusinessConnection
752-
write FOnReceiveBusinessConnection;
753-
property OnReceiveBusinessMessage: TMessageEvent read FOnReceiveBusinessMessage
754-
write FOnReceiveBusinessMessage;
755-
property OnReceiveMessageReaction: TMessageReactionEvent read FOnReceiveMessageReaction
756-
write FOnReceiveMessageReaction;
757-
property OnReceiveMessageReactionCount: TMessageReactionCountEvent read FOnReceiveMessageReactionCount
758-
write FOnReceiveMessageReactionCount;
759-
property OnReceiveMyChatMemberUpdated: TChatMemberEvent read FOnReceiveMyChatMemberUpdated
760-
write FOnReceiveMyChatMemberUpdated;
753+
property OnReceivePreCheckoutQuery: TPreCheckoutQueryEvent read FOnReceivePreCheckoutQuery
754+
write FOnReceivePreCheckoutQuery;
755+
property OnReceiveSuccessfulPayment: TMessageEvent read FOnReceiveSuccessfulPayment
756+
write FOnReceiveSuccessfulPayment;
757+
property OnReceiveBusinessConnection: TBusinessConnectionEvent read FOnReceiveBusinessConnection
758+
write FOnReceiveBusinessConnection;
759+
property OnReceiveBusinessMessage: TMessageEvent read FOnReceiveBusinessMessage
760+
write FOnReceiveBusinessMessage;
761+
property OnReceiveMessageReaction: TMessageReactionEvent read FOnReceiveMessageReaction
762+
write FOnReceiveMessageReaction;
763+
property OnReceiveMessageReactionCount: TMessageReactionCountEvent read FOnReceiveMessageReactionCount
764+
write FOnReceiveMessageReactionCount;
765+
property OnReceiveMyChatMemberUpdated: TChatMemberEvent read FOnReceiveMyChatMemberUpdated
766+
write FOnReceiveMyChatMemberUpdated;
761767
property OnReceiveChatMemberUpdated: TChatMemberEvent read FOnReceiveChatMemberUpdated
762768
write FOnReceiveChatMemberUpdated;
763769
end;
@@ -856,6 +862,7 @@ implementation
856862
s_OneTimeKeyboard = 'one_time_keyboard';
857863
s_RequestContact = 'request_contact';
858864
s_RequestLocation = 'request_location';
865+
s_Style = 'style';
859866
s_SwitchInlineQuery = 'switch_inline_query';
860867
s_CallbackData = 'callback_data';
861868
s_SwitchInlineQueryCurrentChat = 's_switch_inline_query_current_chat';
@@ -1697,6 +1704,11 @@ function TKeyboardButton.Gettext: String;
16971704
Result:=Strings[s_text];
16981705
end;
16991706

1707+
function TKeyboardButton.GetStyle: String;
1708+
begin
1709+
Result:=Strings[s_Style];
1710+
end;
1711+
17001712
procedure TKeyboardButton.SetRequestContact(AValue: Boolean);
17011713
begin
17021714
Booleans[s_RequestContact]:=AValue;
@@ -1712,6 +1724,11 @@ procedure TKeyboardButton.Settext(AValue: String);
17121724
Strings[s_text]:=AValue;
17131725
end;
17141726

1727+
procedure TKeyboardButton.SetStyle(const AValue: String);
1728+
begin
1729+
Strings[s_Style]:=AValue;
1730+
end;
1731+
17151732
constructor TKeyboardButton.Create(const AText: String);
17161733
begin
17171734
inherited Create;
@@ -1910,6 +1927,11 @@ procedure TInlineKeyboardButton.Settext(AValue: String);
19101927
Strings[s_text]:=AValue;
19111928
end;
19121929

1930+
procedure TInlineKeyboardButton.SetStyle(AValue: String);
1931+
begin
1932+
Strings[s_Style]:=AValue;
1933+
end;
1934+
19131935
procedure TInlineKeyboardButton.Setcallback_data(AValue: String);
19141936
begin
19151937
CheckOptnlAndSet(s_callbackdata, AValue);
@@ -1920,6 +1942,11 @@ function TInlineKeyboardButton.Geturl: String;
19201942
Result:=Strings[s_url];
19211943
end;
19221944

1945+
function TInlineKeyboardButton.GetStyle: String;
1946+
begin
1947+
Result:=Strings[s_Style];
1948+
end;
1949+
19231950
function TInlineKeyboardButton.CheckOptnlNull: Boolean;
19241951
begin
19251952
Result:=not (Assigned(Find(s_CallbackData)) or Assigned(Find(s_SwitchInlineQuery)) or
@@ -2277,11 +2304,11 @@ procedure TTelegramSender.DoReceiveMyChatMemberQuery(AMyChatMember: TTelegramCha
22772304
FOnReceiveMyChatMemberUpdated(Self, AMyChatMember);
22782305
end;
22792306

2280-
procedure TTelegramSender.DoReceiveChatMemberQuery(AChatMember: TTelegramChatMemberUpdated);
2281-
begin
2282-
FCurrentMessage:=nil;
2283-
FCurrentChat:=AChatMember.Chat;
2284-
FCurrentUser:=AChatMember.From;
2307+
procedure TTelegramSender.DoReceiveChatMemberQuery(AChatMember: TTelegramChatMemberUpdated);
2308+
begin
2309+
FCurrentMessage:=nil;
2310+
FCurrentChat:=AChatMember.Chat;
2311+
FCurrentUser:=AChatMember.From;
22852312
FCurrentThreadId:=_nullThrd;
22862313
FCurrentIsTopicMessage:=False;
22872314
FCurrentChatId:=FCurrentUser.ID;
@@ -2290,41 +2317,41 @@ procedure TTelegramSender.DoReceiveChatMemberQuery(AChatMember: TTelegramChatMem
22902317
DoAfterParseUpdate;
22912318
if FLanguage=EmptyStr then
22922319
SetLanguage(CurrentLanguage(FCurrentUser));
2293-
if Assigned(FOnReceiveChatMemberUpdated) then
2294-
FOnReceiveChatMemberUpdated(Self, AChatMember);
2295-
end;
2296-
2297-
procedure TTelegramSender.DoReceiveMessageReaction(
2298-
AMessageReaction: TTelegramMessageReactionUpdated);
2299-
begin
2300-
FCurrentMessage:=nil;
2301-
FCurrentChat:=AMessageReaction.Chat;
2302-
FCurrentChatID:=AMessageReaction.Chat.ID;
2303-
FCurrentThreadId:=_nullThrd;
2304-
FCurrentIsTopicMessage:=False;
2305-
FCurrentUser:=AMessageReaction.User;
2306-
if CurrentIsBanned then
2307-
Exit;
2308-
DoAfterParseUpdate;
2309-
if Assigned(FOnReceiveMessageReaction) then
2310-
FOnReceiveMessageReaction(Self, AMessageReaction);
2311-
end;
2312-
2313-
procedure TTelegramSender.DoReceiveMessageReactionCount(
2314-
AMessageReactionCount: TTelegramMessageReactionCountUpdated);
2315-
begin
2316-
FCurrentMessage:=nil;
2317-
FCurrentChat:=AMessageReactionCount.Chat;
2318-
FCurrentChatID:=AMessageReactionCount.Chat.ID;
2319-
FCurrentThreadId:=_nullThrd;
2320-
FCurrentIsTopicMessage:=False;
2321-
FCurrentUser:=nil;
2322-
if CurrentIsBanned then
2323-
Exit;
2324-
DoAfterParseUpdate;
2325-
if Assigned(FOnReceiveMessageReactionCount) then
2326-
FOnReceiveMessageReactionCount(Self, AMessageReactionCount);
2327-
end;
2320+
if Assigned(FOnReceiveChatMemberUpdated) then
2321+
FOnReceiveChatMemberUpdated(Self, AChatMember);
2322+
end;
2323+
2324+
procedure TTelegramSender.DoReceiveMessageReaction(
2325+
AMessageReaction: TTelegramMessageReactionUpdated);
2326+
begin
2327+
FCurrentMessage:=nil;
2328+
FCurrentChat:=AMessageReaction.Chat;
2329+
FCurrentChatID:=AMessageReaction.Chat.ID;
2330+
FCurrentThreadId:=_nullThrd;
2331+
FCurrentIsTopicMessage:=False;
2332+
FCurrentUser:=AMessageReaction.User;
2333+
if CurrentIsBanned then
2334+
Exit;
2335+
DoAfterParseUpdate;
2336+
if Assigned(FOnReceiveMessageReaction) then
2337+
FOnReceiveMessageReaction(Self, AMessageReaction);
2338+
end;
2339+
2340+
procedure TTelegramSender.DoReceiveMessageReactionCount(
2341+
AMessageReactionCount: TTelegramMessageReactionCountUpdated);
2342+
begin
2343+
FCurrentMessage:=nil;
2344+
FCurrentChat:=AMessageReactionCount.Chat;
2345+
FCurrentChatID:=AMessageReactionCount.Chat.ID;
2346+
FCurrentThreadId:=_nullThrd;
2347+
FCurrentIsTopicMessage:=False;
2348+
FCurrentUser:=nil;
2349+
if CurrentIsBanned then
2350+
Exit;
2351+
DoAfterParseUpdate;
2352+
if Assigned(FOnReceiveMessageReactionCount) then
2353+
FOnReceiveMessageReactionCount(Self, AMessageReactionCount);
2354+
end;
23282355

23292356
procedure TTelegramSender.DoReceiveSuccessfulPayment(
23302357
AMessage: TTelegramMessageObj);
@@ -2394,13 +2421,13 @@ procedure TTelegramSender.DoReceiveUpdate(AnUpdate: TTelegramUpdateObj);
23942421
utChosenInlineResult: DoReceiveChosenInlineResult(AnUpdate.ChosenInlineResult);
23952422
utCallbackQuery: DoReceiveCallbackQuery(AnUpdate.CallbackQuery);
23962423
utPreCheckoutQuery: DoReceivePreCheckoutQuery(AnUpdate.PreCheckoutQuery);
2397-
utMyChatMember: DoReceiveMyChatMemberQuery(AnUpdate.MyChatMember);
2398-
utChatMember: DoReceiveChatMemberQuery(AnUpdate.ChatMember);
2399-
utBusinessConnection: DoReceiveBusinessConnection(AnUpdate.BusinessConnection);
2400-
utBusinessMessage: DoReceiveBusinessMessage(AnUpdate.BusinessMessage);
2401-
utMessageReaction: DoReceiveMessageReaction(AnUpdate.MessageReaction);
2402-
utMessageReactionCount: DoReceiveMessageReactionCount(AnUpdate.MessageReactionCount);
2403-
end;
2424+
utMyChatMember: DoReceiveMyChatMemberQuery(AnUpdate.MyChatMember);
2425+
utChatMember: DoReceiveChatMemberQuery(AnUpdate.ChatMember);
2426+
utBusinessConnection: DoReceiveBusinessConnection(AnUpdate.BusinessConnection);
2427+
utBusinessMessage: DoReceiveBusinessMessage(AnUpdate.BusinessMessage);
2428+
utMessageReaction: DoReceiveMessageReaction(AnUpdate.MessageReaction);
2429+
utMessageReactionCount: DoReceiveMessageReactionCount(AnUpdate.MessageReactionCount);
2430+
end;
24042431
if Assigned(FUpdateLogger) then
24052432
if CurrentIsSimpleUser then // This is to ensure that admins and moderators do not affect the statistics
24062433
FUpdateLogger.Log(AnUpdate.AsString);

0 commit comments

Comments
 (0)