|
| 1 | +/// êëàññ äëÿ ðàáîòû ñ API Telegram |
| 2 | +Class Telegram.API Extends %RegisteredObject |
| 3 | +{ |
| 4 | + |
| 5 | +Property Token as %String; |
| 6 | + |
| 7 | +Parameter SERVER = "api.telegram.org"; |
| 8 | + |
| 9 | +Property SSLConfiguration as %String; |
| 10 | + |
| 11 | +Method GetRequestObj() as %Net.HttpRequest [Private ] |
| 12 | +{ |
| 13 | + #dim request as %Net.HttpRequest |
| 14 | + set request = ##class(%Net.HttpRequest).%New() |
| 15 | + set request.Server = ..#SERVER |
| 16 | + set request.SSLConfiguration = ..SSLConfiguration |
| 17 | + set request.Https = 1 |
| 18 | + return request |
| 19 | +} |
| 20 | + |
| 21 | +Method ExecuteRequest(request as %Net.HttpRequest, method as %String) as %DynamicObject [Private ] |
| 22 | +{ |
| 23 | + set st = request.Post("bot"_..Token_"/"_method) |
| 24 | + if ($$$ISERR(st)) { |
| 25 | + throw ##class(%Exception.StatusException).CreateFromStatus(st) |
| 26 | + } |
| 27 | + return ##class(%Library.DynamicObject).%FromJSON(request.HttpResponse.Data) |
| 28 | +} |
| 29 | + |
| 30 | +Method %OnNew(token as %String, ssl as %String) as %Status [Private ] |
| 31 | +{ |
| 32 | + return:(token="" || ssl="") 0 |
| 33 | + set ..Token = token |
| 34 | + set ..SSLConfiguration = ssl |
| 35 | + return $$$OK |
| 36 | +} |
| 37 | + |
| 38 | +Method GetMe() as %DynamicObject |
| 39 | +{ |
| 40 | + return ..ExecuteRequest(..GetRequestObj(), "getMe") |
| 41 | +} |
| 42 | + |
| 43 | +Method GetUpdates(offset as %Integer = "", limit as %Integer = 100, timeout as %Integer = 0) as %DynamicObject |
| 44 | +{ |
| 45 | + #dim request as %Net.HttpRequest |
| 46 | + set request = ..GetRequestObj() |
| 47 | + if (offset'="") { |
| 48 | + do request.InsertFormData("offset",offset) |
| 49 | + } |
| 50 | + do request.InsertFormData("limit",limit) |
| 51 | + do request.InsertFormData("timeout",timeout) |
| 52 | + return ..ExecuteRequest(request, "getUpdates") |
| 53 | +} |
| 54 | + |
| 55 | +Method SendMessage(chatId as %Integer, |
| 56 | + text as %String, |
| 57 | + parseMode as %String = "", |
| 58 | + disableWebPagePreview as %Boolean = 0, |
| 59 | + disableNotification as %Boolean = 0, |
| 60 | + replyToMessageId as %Integer = 0, |
| 61 | + replyMarkup as %DynamicObject = 0) as %DynamicObject |
| 62 | +{ |
| 63 | + #dim request as %Net.HttpRequest |
| 64 | + set request = ..GetRequestObj() |
| 65 | + do request.InsertFormData("chat_id",chatId) |
| 66 | + do request.InsertFormData("text",text) |
| 67 | + if (replyMarkup'=0) { |
| 68 | + do request.InsertFormData("reply_markup",replyMarkup.%ToJSON()) |
| 69 | + } |
| 70 | + return ..ExecuteRequest(request, "sendMessage") |
| 71 | +} |
| 72 | +/// First create instance of Telegram.API: |
| 73 | +/// set api = ##class(Telegram.API).%New(token, <ssl_configuration_name) |
| 74 | +/// Set webhook with |
| 75 | +/// write api.SetWebhook(url,certificate_folder, certificate_filename).%ToJSON() |
| 76 | +Method SetWebhook(url as %String, filedir as %String, filename as %String) as %DynamicObject |
| 77 | +{ |
| 78 | + Set SentHttpRequest=..GetRequestObj() |
| 79 | + |
| 80 | + Set RootMIMEPart = ##class(%Net.MIMEPart).%New() |
| 81 | + |
| 82 | + Set BinaryMIMEPart = ##class(%Net.MIMEPart).%New() |
| 83 | + Set contentdisp = "form-data; name="_$CHAR(34)_"certificate"_$CHAR(34)_"; filename=" |
| 84 | + _$CHAR(34)_""_filename_""_$CHAR(34) |
| 85 | + Do BinaryMIMEPart.SetHeader("Content-Disposition",contentdisp) |
| 86 | + |
| 87 | + Set stream=##class(%FileBinaryStream).%New() |
| 88 | + Set stream.Filename=filedir_filename |
| 89 | + Do stream.LinkToFile(filedir_filename) |
| 90 | + |
| 91 | + Set BinaryMIMEPart.Body=stream |
| 92 | + Do BinaryMIMEPart.SetHeader("Content-Type","text/plain") |
| 93 | + |
| 94 | + Do RootMIMEPart.Parts.Insert(BinaryMIMEPart) |
| 95 | + |
| 96 | + Set TextMIMEPart=##class(%Net.MIMEPart).%New() |
| 97 | + Set TextMIMEPart.Body=##class(%GlobalCharacterStream).%New() |
| 98 | + Do TextMIMEPart.Body.Write(url) |
| 99 | + |
| 100 | + Set contentdisp = "form-data; name="_$CHAR(34)_"url"_$CHAR(34)_";" |
| 101 | + Do TextMIMEPart.SetHeader("Content-Disposition",contentdisp) |
| 102 | + |
| 103 | + Do RootMIMEPart.Parts.Insert(TextMIMEPart) |
| 104 | + |
| 105 | + Set writer=##class(%Net.MIMEWriter).%New() |
| 106 | + |
| 107 | + Set status=writer.OutputToStream(SentHttpRequest.EntityBody) |
| 108 | + if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit} |
| 109 | + |
| 110 | + Set status=writer.WriteMIMEBody(RootMIMEPart) |
| 111 | + if $$$ISERR(status) {do $SYSTEM.Status.DisplayError(status) Quit} |
| 112 | + |
| 113 | + |
| 114 | + //do SentHttpRequest.InsertFormData("url",url) |
| 115 | + |
| 116 | + Set ContentType= "multipart/form-data; boundary="_RootMIMEPart.Boundary |
| 117 | + Set SentHttpRequest.ContentType=ContentType |
| 118 | + |
| 119 | + set st = SentHttpRequest.Post("bot"_..Token_"/setWebhook") |
| 120 | + |
| 121 | + |
| 122 | + return ##class(%Library.DynamicObject).%FromJSON(SentHttpRequest.HttpResponse.Data) |
| 123 | +} |
| 124 | + |
| 125 | +Method DeleteWebhook() as %DynamicObject |
| 126 | +{ |
| 127 | + return ..ExecuteRequest(..GetRequestObj(), "deleteWebhook") |
| 128 | +} |
| 129 | + |
| 130 | +Method GetWebhookInfo() as %DynamicObject |
| 131 | +{ |
| 132 | + return ..ExecuteRequest(..GetRequestObj(), "getWebhookInfo") |
| 133 | +} |
| 134 | + |
| 135 | +} |
0 commit comments