Bots are the next hot thing in 2016! So in my spare-spare time I’ve been working on a wrapper for the Telegram API v2.0. It has a rather unconventional API but I’m reworking it to make it very easy to write bots in B4J.
Bots could be very useful as yet another way to ‘talk’ with IoT devices. You can control LEDs, temperatures, ask for stats etc right from within the Telegram Chat App (which runs on about every kind of platform, being the desktop, a browser, iOS, Android, etc…). Or you can, like I did to test the wrapper, write a little game:
Note: this library is in very early stages so the wrapper is not available for download yet. Full source code of the game will also be available when released.
Some sample code to show you how easy it is to write a bot in B4J (this is not the game code, just some tests):
Code to initialize the library:
Sub Process_Globals Dim ABT As ABTelegram End Sub Sub AppStart (Args() As String) Dim b As MyBot b.Initialize ABT.RegisterLongPollingBot(b.Bot) StartMessageLoop End Sub
Code for the Bot:
'Class module Sub Class_Globals Dim ABT As ABTelegram Public Bot As ABTLongPollingBot Private botToken As String = "207189xxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" Private botUserName As String = "zzzzzzzzzBot" 'Private callbackCounter As Int End Sub 'Initializes the object. You can add parameters to this method if needed. Public Sub Initialize Bot.Initialize("Bot", Me, botToken, botUserName) Dim upds As List = Bot.botgetUpdates For i = 0 To upds.Size - 1 Dim upd As ABTUpdate = upds.Get(i) Log("Go update: " & upd.UpdateId) Next End Sub Sub Bot_UpdateReceived(update As ABTUpdate) Log("Got an update") If update.hasMessage Then Dim msg As ABTMessage = update.GetMessage Log("Message: " & msg.Text) ' Dim userPhotos As ABTUserProfilePhotos = Bot.BotGetUserProfilePhotos(msg.Chat.id) ' Log("photos: " & userPhotos.TotalCount) ' Dim Photos As List = userPhotos.Photos ' For i = 0 To Photos.Size - 1 ' Dim photoSizes As ABTPhotoSizes = Photos.Get(i) ' For j = 0 To photoSizes.Sizes.Size - 1 ' Dim photoSize As ABTPhotoSize = photoSizes.Sizes.Get(j) ' Dim photoFile As ABTFile = Bot.BotGetFile(photoSize.FileId) ' Log(photoFile.FilePath) ' ' Dim job1 As HttpJob ' job1.Initialize("Job" & j, Me) ' job1.Tag = photoFile.FilePath.Replace("photo/", "") ' ' Dim url As String = "https://api.telegram.org/file/bot" & botToken & "/" & photoFile.FilePath ' job1.Download(url) ' Next ' Next ' callbackCounter = callbackCounter + 1 ' Bot.BotSendMessageAsync(callbackCounter, msg.ChatId, "Alweer hallo " & msg.Chat.FirstName) Bot.BotSendMessage(msg.ChatId, "Using an Emoji " & ":grinning: in the message!") ' see https://github.com/vdurmont/emoji-java for a list of emojis ' Bot.BotSendPhoto(True, msg.ChatId, File.DirApp & "/" & "telegram.png") ' callbackCounter = callbackCounter + 1 ' Bot.BotSendDocumentAsync(callbackCounter, True, msg.ChatId, File.DirApp & "/" & "mydocument.pdf", "mydocument.pdf") ' Bot.BotSendDocument(True, msg.ChatId, File.DirApp & "/" & "mydocument.pdf", "mydocument.pdf") Bot.BotSendAudio(True, msg.ChatId, File.DirApp & "/" & "myaudio.mp3") ' Bot.BotSendVideo(True, msg.ChatId, File.DirApp & "/" & "myvideo.mp4") ' Bot.BotSendSticker(True, msg.ChatId, File.DirApp & "/" & "mysticker.webp") ' Bot.BotSendContact(msg.ChatId, "+32496000000", "Alain") ' Bot.BotSendChatAction(msg.ChatId, ABT.CHATACTIONTYPE_TYPING) ' Bot.BotSendLocation(msg.ChatId, 50.8492, 2.8779) ' Bot.BotSendVenue(msg.ChatId, 50.8492, 2.8779, "my venue", "Grote markt 1") Bot.BotSendVoice(True, msg.ChatId, File.DirApp & "/" & "telegram.ogg") ' Dim keyb As ABTReplyKeyboard ' Dim rows As List ' rows.Initialize ' Dim tmpRow As ABTInlineKeyboardRow ' tmpRow.Initialize ' tmpRow.AddButton("test button", "http://one-two.com", "", "") ' rows.Add(tmpRow) ' keyb.InitializeAsInlineKeyboardMarkup(rows) ' Bot.BotEditMessageTextEx(msg.ChatId, msg.MessageId, 0, "Extended test", ABT.PARSEMODE_HTML, False, keyb) Dim rkeyb As ABTReplyKeyboard rkeyb.InitializeAsForceReplyKeyboard(False) Bot.BotSendMessageEx(msg.ChatId, "some test: reply please", ABT.PARSEMODE_HTML, False, False, 0, rkeyb) ' Dim rkeyb2 As ABTReplyKeyboard ' Dim rows2 As List ' rows2.Initialize ' For i = 1 To 100 ' Dim tmpRow2 As ABTKeyboardRow ' tmpRow2.Initialize ' tmpRow2.AddButton("Press me") ' rows2.Add(tmpRow2) ' Next ' rkeyb2.InitializeAsReplyKeyboardMarkup(rows2,False, False, False) ' Bot.BotSendMessageEx(msg.ChatId, "some test: press the button", ABT.PARSEMODE_HTML, False, False, 0, rkeyb2) ' Dim rkeyb3 As ABTReplyKeyboard ' Dim rows3 As List ' rows3.Initialize ' Dim tmpRow3 As ABTInlineKeyboardRow ' tmpRow3.Initialize ' tmpRow3.AddButton("Show image", "", "showimage", "") ' rows3.Add(tmpRow3) ' ' rkeyb3.InitializeAsInlineKeyboardMarkup(rows3) ' Bot.BotSendMessageEx(msg.ChatId, "some test: press the button", ABT.PARSEMODE_HTML, False, False, 0, rkeyb3) End If If update.hasCallbackQuery Then Dim cquery As ABTCallbackQuery = update.GetCallbackQuery Log("CallbackQuery: " & cquery.data) Select Case cquery.Data Case "showimage" Dim msg As ABTMessage = cquery.Message Bot.BotSendPhotoEx(True, msg.ChatId , File.DirApp & "/" & "myphoto.jpg", "A new photo of darth vader!",False, 0, Null ) Bot.BotSendLocation(msg.ChatId, 50.8492, 2.8779) Bot.BotEditMessageText(msg.ChatId, msg.MessageId, "", "Shown") End Select End If If update.hasInlineQuery Then Dim ciquery As ABTInlineQuery = update.GetInlineQuery Log("InlineQuery: " & ciquery.Query) If ciquery.Query = "loc" Then Dim lstResults As List lstResults.Initialize Dim myanswer As ABTInlineQueryResult myanswer.InitializeAsLocation("1", 50.8492, 2.8779, "Your location") lstResults.Add(myanswer) Bot.BotAnswerInlineQuery(ciquery.Id, lstResults) End If End If If update.hasChosenInlineResult Then Dim ccresult As ABTChosenInlineResult = update.GetChosenInlineResult Log("ChosenInlineResult: " & ccresult.Query) End If End Sub Sub Bot_AsyncSendReceived(methodType As String, callbackId As String, success As Boolean, asyncObject As ABTObject) Log("Async method: " & callbackId & " " & methodType & " " & success) If success And asyncObject <> Null Then If asyncObject.objectType="ABTMessage" Then Dim message As ABTMessage = asyncObject Log("Async callback: " & message.MessageId) End If End If End Sub Sub JobDone (Job As HttpJob) Log("JobName = " & Job.JobName & ", Success = " & Job.Success) If Job.Success = True Then Dim fSave As OutputStream = File.OpenOutput(File.DirApp, Job.tag, False) File.Copy2(Job.GetInputStream, fSave) fSave.Close Else Log("Error: " & Job.ErrorMessage) End If Job.Release End Sub
Alwaysbusy
Click here to if you like my work