Share My Creation [ABTelegram] Telegram Bots for B4J

ABTelegram.jpg

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 (B4T?). 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 :)

Please play/test and vote! https://storebot.me/bot/mmcus_bot

Note: this 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:
B4X:
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

The myBot class:
B4X:
'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
 

Attachments

  • ABTelegram.png
    ABTelegram.png
    139.6 KB · Views: 4,244
Last edited:

u2005k

Member
Licensed User
Longtime User
Hi AlwaysBusy,

Do you have any timeline about releasing ABTelegram?

Thanks & regards...
Uday
 
Top