2023-06-09 20:03:53 +00:00
2023-07-21 13:56:14 +00:00
<!DOCTYPE html>
< html class = "no-js" lang = "en" >
< head >
< meta charset = "utf-8" / >
< meta content = "width=device-width,initial-scale=1" name = "viewport" / >
< meta content = "Single documentation place for all Insanus Mokrassar libraries" name = "description" / >
< meta content = "Ovsiannikov Aleksei" name = "author" / >
< link href = "https://docs.inmo.dev/tgbotapi/updates/heroku.html" rel = "canonical" / >
< link href = "webhooks.html" rel = "prev" / >
< link href = "../logic/api-extensions.html" rel = "next" / >
< link href = "../../resources/images/favicon.png" rel = "icon" / >
2023-09-02 22:14:53 +00:00
< meta content = "mkdocs-1.5.2, mkdocs-material-9.2.7" name = "generator" / >
2023-07-21 13:56:14 +00:00
< title > Heroku - InMo Docs< / title >
2023-09-02 22:14:53 +00:00
< link href = "../../assets/stylesheets/main.046329b4.min.css" rel = "stylesheet" / >
< link href = "../../assets/stylesheets/palette.85d0ee34.min.css" rel = "stylesheet" / >
2023-07-21 13:56:14 +00:00
< link crossorigin = "" href = "https://fonts.gstatic.com" rel = "preconnect" / >
< link href = "https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback" rel = "stylesheet" / >
< style > : root { --md-text-font : "Roboto" ; --md-code-font : "Roboto Mono" } < / style >
< link href = "../../resources/stylesheets/navigation.css" rel = "stylesheet" / >
< script > _ _md _scope = new URL ( "../.." , location ) , _ _md _hash = e => [ ... e ] . reduce ( ( e , _ ) => ( e << 5 ) - e + _ . charCodeAt ( 0 ) , 0 ) , _ _md _get = ( e , _ = localStorage , t = _ _md _scope ) => JSON . parse ( _ . getItem ( t . pathname + "." + e ) ) , _ _md _set = ( e , _ , t = localStorage , a = _ _md _scope ) => { try { t . setItem ( a . pathname + "." + e , JSON . stringify ( _ ) ) } catch ( e ) { } } < / script >
< script id = "__analytics" > function _ _md _analytics ( ) { function n ( ) { dataLayer . push ( arguments ) } window . dataLayer = window . dataLayer || [ ] , n ( "js" , new Date ) , n ( "config" , "G-615VY8CQSM" ) , document . addEventListener ( "DOMContentLoaded" , function ( ) { document . forms . search && document . forms . search . query . addEventListener ( "blur" , function ( ) { this . value && n ( "event" , "search" , { search _term : this . value } ) } ) , document $ . subscribe ( function ( ) { var a = document . forms . feedback ; if ( void 0 !== a ) for ( var e of a . querySelectorAll ( "[type=submit]" ) ) e . addEventListener ( "click" , function ( e ) { e . preventDefault ( ) ; var t = document . location . pathname , e = this . getAttribute ( "data-md-value" ) ; n ( "event" , "feedback" , { page : t , data : e } ) , a . firstElementChild . disabled = ! 0 ; e = a . querySelector ( ".md-feedback__note [data-md-value='" + e + "']" ) ; e && ( e . hidden = ! 1 ) } ) , a . hidden = ! 1 } ) , location$ . subscribe ( function ( e ) { n ( "config" , "G-615VY8CQSM" , { page _path : e . pathname } ) } ) } ) ; var e = document . createElement ( "script" ) ; e . async = ! 0 , e . src = "https://www.googletagmanager.com/gtag/js?id=G-615VY8CQSM" , document . getElementById ( "__analytics" ) . insertAdjacentElement ( "afterEnd" , e ) } < / script >
< script > "undefined" != typeof _ _md _analytics && _ _md _analytics ( ) < / script >
< / head >
< body data-md-color-accent = "cyan" data-md-color-primary = "teal" data-md-color-scheme = "default" dir = "ltr" >
< script > var palette = _ _md _get ( "__palette" ) ; if ( palette && "object" == typeof palette . color ) for ( var key of Object . keys ( palette . color ) ) document . body . setAttribute ( "data-md-color-" + key , palette . color [ key ] ) < / script >
< input autocomplete = "off" class = "md-toggle" data-md-toggle = "drawer" id = "__drawer" type = "checkbox" / >
< input autocomplete = "off" class = "md-toggle" data-md-toggle = "search" id = "__search" type = "checkbox" / >
< label class = "md-overlay" for = "__drawer" > < / label >
< div data-md-component = "skip" >
< a class = "md-skip" href = "#heroku" >
2023-06-09 20:03:53 +00:00
Skip to content
< / a >
2023-07-21 13:56:14 +00:00
< / div >
< div data-md-component = "announce" >
< / div >
2023-06-09 20:03:53 +00:00
< header class = "md-header" data-md-component = "header" >
2023-07-21 13:56:14 +00:00
< nav aria-label = "Header" class = "md-header__inner md-grid" >
< a aria-label = "InMo Docs" class = "md-header__button md-logo" data-md-component = "logo" href = "../../index.html" title = "InMo Docs" >
< img alt = "logo" src = "../../resources/images/logo.png" / >
< / a >
< label class = "md-header__button md-icon" for = "__drawer" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z" > < / path > < / svg >
< / label >
< div class = "md-header__title" data-md-component = "header-title" >
< div class = "md-header__ellipsis" >
< div class = "md-header__topic" >
< span class = "md-ellipsis" >
2023-06-09 20:03:53 +00:00
InMo Docs
< / span >
2023-07-21 13:56:14 +00:00
< / div >
< div class = "md-header__topic" data-md-component = "header-topic" >
< span class = "md-ellipsis" >
2023-06-09 20:03:53 +00:00
Heroku
< / span >
2023-07-21 13:56:14 +00:00
< / div >
< / div >
< / div >
< form class = "md-header__option" data-md-component = "palette" >
< input aria-label = "Switch to dark mode" class = "md-option" data-md-color-accent = "cyan" data-md-color-media = "" data-md-color-primary = "teal" data-md-color-scheme = "default" id = "__palette_1" name = "__palette" type = "radio" / >
< label class = "md-header__button md-icon" for = "__palette_2" hidden = "" title = "Switch to dark mode" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z" > < / path > < / svg >
< / label >
< input aria-label = "Switch to light mode" class = "md-option" data-md-color-accent = "light-blue" data-md-color-media = "" data-md-color-primary = "blue-grey" data-md-color-scheme = "slate" id = "__palette_2" name = "__palette" type = "radio" / >
< label class = "md-header__button md-icon" for = "__palette_1" hidden = "" title = "Switch to light mode" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12c0-2.42-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69Z" > < / path > < / svg >
< / label >
< / form >
< label class = "md-header__button md-icon" for = "__search" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z" > < / path > < / svg >
< / label >
< div class = "md-search" data-md-component = "search" role = "dialog" >
< label class = "md-search__overlay" for = "__search" > < / label >
< div class = "md-search__inner" role = "search" >
< form class = "md-search__form" name = "search" >
< input aria-label = "Search" autocapitalize = "off" autocomplete = "off" autocorrect = "off" class = "md-search__input" data-md-component = "search-query" name = "query" placeholder = "Search" required = "" spellcheck = "false" type = "text" / >
< label class = "md-search__icon md-icon" for = "__search" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z" > < / path > < / svg >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z" > < / path > < / svg >
< / label >
< nav aria-label = "Search" class = "md-search__options" >
< a aria-label = "Share" class = "md-search__icon md-icon" data-clipboard = "" data-clipboard-text = "" data-md-component = "search-share" href = "javascript:void(0)" tabindex = "-1" title = "Share" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z" > < / path > < / svg >
< / a >
< button aria-label = "Clear" class = "md-search__icon md-icon" tabindex = "-1" title = "Clear" type = "reset" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z" > < / path > < / svg >
< / button >
< / nav >
< div class = "md-search__suggest" data-md-component = "search-suggest" > < / div >
< / form >
< div class = "md-search__output" >
< div class = "md-search__scrollwrap" data-md-scrollfix = "" >
< div class = "md-search-result" data-md-component = "search-result" >
< div class = "md-search-result__meta" >
2023-06-09 20:03:53 +00:00
Initializing search
< / div >
2023-07-21 13:56:14 +00:00
< ol class = "md-search-result__list" role = "presentation" > < / ol >
2023-06-09 20:03:53 +00:00
< / div >
2023-07-21 13:56:14 +00:00
< / div >
< / div >
< / div >
< / div >
< div class = "md-header__source" >
< a class = "md-source" data-md-component = "source" href = "https://github.com/InsanusMokrassar/docs" title = "Go to repository" >
< div class = "md-source__icon md-icon" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 448 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / div >
< div class = "md-source__repository" >
2023-06-09 20:03:53 +00:00
InsanusMokrassar/docs
< / div >
< / a >
2023-07-21 13:56:14 +00:00
< / div >
< / nav >
2023-06-09 20:03:53 +00:00
< / header >
2023-07-21 13:56:14 +00:00
< div class = "md-container" data-md-component = "container" >
< nav aria-label = "Tabs" class = "md-tabs" data-md-component = "tabs" >
< div class = "md-grid" >
< ul class = "md-tabs__list" >
< li class = "md-tabs__item" >
< a class = "md-tabs__link" href = "../../index.html" >
2023-09-02 22:14:53 +00:00
Home
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-tabs__item" >
< a class = "md-tabs__link" href = "../../micro_utils/index.html" >
2023-09-02 22:14:53 +00:00
MicroUtils
< / a >
2023-07-21 13:56:14 +00:00
< / li >
2023-09-02 22:14:53 +00:00
< li class = "md-tabs__item md-tabs__item--active" >
< a class = "md-tabs__link" href = "../index.html" >
Telegram Bot API
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-tabs__item" >
< a class = "md-tabs__link" href = "../../krontab/index.html" >
2023-09-02 22:14:53 +00:00
Krontab
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-tabs__item" >
< a class = "md-tabs__link" href = "../../kslog/index.html" >
2023-09-02 22:14:53 +00:00
KSLog
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-tabs__item" >
< a class = "md-tabs__link" href = "../../navigation/index.html" >
2023-09-02 22:14:53 +00:00
Navigation
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / div >
2023-06-09 20:03:53 +00:00
< / nav >
2023-07-21 13:56:14 +00:00
< main class = "md-main" data-md-component = "main" >
< div class = "md-main__inner md-grid" >
< div class = "md-sidebar md-sidebar--primary" data-md-component = "sidebar" data-md-type = "navigation" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav aria-label = "Navigation" class = "md-nav md-nav--primary md-nav--lifted" data-md-level = "0" >
< label class = "md-nav__title" for = "__drawer" >
< a aria-label = "InMo Docs" class = "md-nav__button md-logo" data-md-component = "logo" href = "../../index.html" title = "InMo Docs" >
< img alt = "logo" src = "../../resources/images/logo.png" / >
< / a >
2023-06-09 20:03:53 +00:00
InMo Docs
< / label >
2023-07-21 13:56:14 +00:00
< div class = "md-nav__source" >
< a class = "md-source" data-md-component = "source" href = "https://github.com/InsanusMokrassar/docs" title = "Go to repository" >
< div class = "md-source__icon md-icon" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 448 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / div >
< div class = "md-source__repository" >
2023-06-09 20:03:53 +00:00
InsanusMokrassar/docs
< / div >
< / a >
2023-07-21 13:56:14 +00:00
< / div >
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../index.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Home
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_2" type = "checkbox" / >
2023-09-02 22:14:53 +00:00
< div class = "md-nav__link md-nav__container" >
< a class = "md-nav__link" href = "../../micro_utils/index.html" >
< span class = "md-ellipsis" >
MicroUtils
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / div >
< nav aria-expanded = "false" aria-labelledby = "__nav_2_label" class = "md-nav" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_2" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
MicroUtils
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--active md-nav__item--nested" >
< input checked = "" class = "md-nav__toggle md-toggle" id = "__nav_3" type = "checkbox" / >
2023-09-02 22:14:53 +00:00
< div class = "md-nav__link md-nav__container" >
< a class = "md-nav__link" href = "../index.html" >
< span class = "md-ellipsis" >
Telegram Bot API
< / span >
< / a >
< label class = "md-nav__link" for = "__nav_3" >
2023-07-21 13:56:14 +00:00
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav aria-expanded = "true" aria-labelledby = "__nav_3_label" class = "md-nav" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_3" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Telegram Bot API
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "https://tgbotapi.inmo.dev" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
KDocs
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../faq.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
FAQ
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_3_4" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_3_4" id = "__nav_3_4_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Introduction
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_3_4_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_3_4" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Introduction
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../introduction/before-any-bot-project.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Before any bot project
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../introduction/including-in-your-project.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Including in your project
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../introduction/proxy-setup.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Proxy setup
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../introduction/first-bot.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
First bot
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_3_5" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_3_5" id = "__nav_3_5_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Guides
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_3_5_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_3_5" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Guides
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../guides/keyboards.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Keyboards Guide
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested" >
< input checked = "" class = "md-nav__toggle md-toggle" id = "__nav_3_6" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_3_6" id = "__nav_3_6_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Updates retrieving
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "true" aria-labelledby = "__nav_3_6_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_3_6" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Updates retrieving
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "updates-filters.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Updates filters
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "long-polling.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Long polling
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "webhooks.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Webhooks
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item md-nav__item--active" >
< input class = "md-nav__toggle md-toggle" id = "__toc" type = "checkbox" / >
< label class = "md-nav__link md-nav__link--active" for = "__toc" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Heroku
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< a class = "md-nav__link md-nav__link--active" href = "heroku.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Heroku
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< nav aria-label = "Table of contents" class = "md-nav md-nav--secondary" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
2023-06-09 20:03:53 +00:00
Table of contents
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "#short-example-with-behaviour-builder" >
2023-06-09 20:03:53 +00:00
Short example with Behaviour Builder
< / a >
< / li >
2023-07-21 13:56:14 +00:00
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "#configuration-example-without-behaviour-builder" >
2023-06-09 20:03:53 +00:00
Configuration example without Behaviour Builder
< / a >
< / li >
2023-07-21 13:56:14 +00:00
< / ul >
2023-06-09 20:03:53 +00:00
< / nav >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_3_7" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_3_7" id = "__nav_3_7_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Logic handling
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_3_7_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_3_7" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Logic handling
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/api-extensions.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
API Extensions
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/behaviour-builder-with-fsm.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Behaviour Builder with FSM
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/behaviour-builder.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Behaviour Builder
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/exceptions-handling.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Exceptions handling
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/files-handling.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Files handling
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/low-level-work-with-bots.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Low-level work with bots
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/media-groups.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Media Groups
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/types-conversations.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Types conversations
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../logic/updates-with-flows.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Updates with flows
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_3_8" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_3_8" id = "__nav_3_8_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
DSLs
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_3_8_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_3_8" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
DSLs
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../dsls/keyboards.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Keyboards
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../dsls/live-location.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Live Location
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../dsls/text.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Text
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_4" type = "checkbox" / >
2023-09-02 22:14:53 +00:00
< div class = "md-nav__link md-nav__container" >
< a class = "md-nav__link" href = "../../krontab/index.html" >
< span class = "md-ellipsis" >
Krontab
< / span >
< / a >
< label class = "md-nav__link" for = "__nav_4" >
2023-07-21 13:56:14 +00:00
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav aria-expanded = "false" aria-labelledby = "__nav_4_label" class = "md-nav" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_4" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Krontab
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "https://krontab.inmo.dev/" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
KDocs
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_4_3" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_4_3" id = "__nav_4_3_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Introduction
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_4_3_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_4_3" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Introduction
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../krontab/introduction/including-in-project.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Including in project
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../krontab/introduction/how-to-use.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
How to use
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../krontab/introduction/faq.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
FAQ
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--section md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_4_4" type = "checkbox" / >
< label class = "md-nav__link" for = "__nav_4_4" id = "__nav_4_4_label" tabindex = "0" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Describing
< / span >
< span class = "md-nav__icon md-icon" > < / span >
2023-07-21 13:56:14 +00:00
< / label >
< nav aria-expanded = "false" aria-labelledby = "__nav_4_4_label" class = "md-nav" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_4_4" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Describing
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../krontab/describing/string-format.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
String format
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../krontab/describing/krontabscheduler.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
KrontabScheduler
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_5" type = "checkbox" / >
2023-09-02 22:14:53 +00:00
< div class = "md-nav__link md-nav__container" >
< a class = "md-nav__link" href = "../../kslog/index.html" >
< span class = "md-ellipsis" >
KSLog
< / span >
< / a >
< label class = "md-nav__link" for = "__nav_5" >
2023-07-21 13:56:14 +00:00
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< / div >
< nav aria-expanded = "false" aria-labelledby = "__nav_5_label" class = "md-nav" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_5" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
KSLog
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "https://kslog.inmo.dev/" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
KDocs
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../kslog/setup.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Setup
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "../../kslog/logging.html" >
2023-09-02 22:14:53 +00:00
< span class = "md-ellipsis" >
Logging
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" id = "__nav_6" type = "checkbox" / >
2023-09-02 22:14:53 +00:00
< div class = "md-nav__link md-nav__container" >
< a class = "md-nav__link" href = "../../navigation/index.html" >
< span class = "md-ellipsis" >
Navigation
< / span >
< / a >
2023-07-21 13:56:14 +00:00
< / div >
< nav aria-expanded = "false" aria-labelledby = "__nav_6_label" class = "md-nav" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_6" >
< span class = "md-nav__icon md-icon" > < / span >
2023-09-02 22:14:53 +00:00
Navigation
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-scrollfix = "" >
< / ul >
2023-06-09 20:03:53 +00:00
< / nav >
2023-07-21 13:56:14 +00:00
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-sidebar md-sidebar--secondary" data-md-component = "sidebar" data-md-type = "toc" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav aria-label = "Table of contents" class = "md-nav md-nav--secondary" >
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
2023-06-09 20:03:53 +00:00
Table of contents
< / label >
2023-07-21 13:56:14 +00:00
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix = "" >
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "#short-example-with-behaviour-builder" >
2023-06-09 20:03:53 +00:00
Short example with Behaviour Builder
< / a >
< / li >
2023-07-21 13:56:14 +00:00
< li class = "md-nav__item" >
< a class = "md-nav__link" href = "#configuration-example-without-behaviour-builder" >
2023-06-09 20:03:53 +00:00
Configuration example without Behaviour Builder
< / a >
< / li >
2023-07-21 13:56:14 +00:00
< / ul >
2023-06-09 20:03:53 +00:00
< / nav >
2023-07-21 13:56:14 +00:00
< / div >
< / div >
< / div >
< div class = "md-content" data-md-component = "content" >
< article class = "md-content__inner md-typeset" >
< a class = "md-content__button md-icon" href = "https://github.com/InsanusMokrassar/docs/edit/master/docs/tgbotapi/updates/heroku.md" title = "Edit this page" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4v-2m10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1 2.1 2.1Z" > < / path > < / svg >
< / a >
< a class = "md-content__button md-icon" href = "https://github.com/InsanusMokrassar/docs/raw/master/docs/tgbotapi/updates/heroku.md" title = "View source of this page" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.15 8.15 0 0 1-1.23-2Z" > < / path > < / svg >
< / a >
< h1 id = "heroku" > Heroku< a class = "headerlink" href = "#heroku" title = "Permanent link" > ¶< / a > < / h1 >
2023-06-09 20:03:53 +00:00
< div class = "admonition note" >
< p class = "admonition-title" > Preview reading< / p >
< p > It is recommended to visit our pages about < a href = "updates-filters.html" > UpdatesFilters< / a > and < a href = "webhooks.html" > Webhooks< / a > to have more clear understanding about what is happening in this examples page< / p >
< / div >
< p > < a href = "https://heroku.com/" > Heroku< / a > is a popular place for bots hosting. In common case you will need to configure webhooks for your server to include getting updates without problems. There are several things related to heroku you should know:< / p >
< ul >
< li > Heroku apps by default accessible via < code > https://< app name> .herokuapp.com/< / code > < / li >
< li > Heroku provide one port to be proxied for the link above. You can retrieve number of this port by calling < code > System.getenv("PORT").toInt()< / code > < / li >
< li > Currently (< code > Sat Aug 15 5:04:21 +00 2020< / code > ) there is only one official server engine for ktor which is correctly working with Heroku: < a href = "https://ktor.io/servers/configuration.html#tomcat" > Tomcat server engine< / a > < / li >
< / ul >
< div class = "admonition note" >
< p class = "admonition-title" > Server configuration alternatives< / p >
< p >
Here will be presented variants of configuration of webhooks and starting server. You always able to set webhook manualy, create your own ktor server and include webhooks handling in it or create and start server with only webhooks handling. More info you can get on page < a href = "webhooks.html" > Webhooks< / a > < / p >
< / div >
2023-07-21 13:56:14 +00:00
< h3 id = "short-example-with-behaviour-builder" > Short example with Behaviour Builder< a class = "headerlink" href = "#short-example-with-behaviour-builder" title = "Permanent link" > ¶< / a > < / h3 >
< div class = "language-kotlin highlight" > < pre > < span > < / span > < code > < span id = "__span-0-1" > < a href = "#__codelineno-0-1" id = "__codelineno-0-1" name = "__codelineno-0-1" > < / a > < span class = "kd" > suspend< / span > < span class = "w" > < / span > < span class = "kd" > fun< / span > < span class = "w" > < / span > < span class = "nf" > main< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-0-2" > < a href = "#__codelineno-0-2" id = "__codelineno-0-2" name = "__codelineno-0-2" > < / a > < span class = "w" > < / span > < span class = "c1" > // This subroute will be used as random webhook subroute to improve security according to the recommendations of Telegram< / span >
< / span > < span id = "__span-0-3" > < a href = "#__codelineno-0-3" id = "__codelineno-0-3" name = "__codelineno-0-3" > < / a > < span class = "w" > < / span > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > subroute< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > uuid4< / span > < span class = "p" > ().< / span > < span class = "na" > toString< / span > < span class = "p" > ()< / span >
< / span > < span id = "__span-0-4" > < a href = "#__codelineno-0-4" id = "__codelineno-0-4" name = "__codelineno-0-4" > < / a > < span class = "w" > < / span > < span class = "c1" > // Input/Output coroutines scope more info here: https://kotlinlang.org/docs/coroutines-guide.html< / span >
< / span > < span id = "__span-0-5" > < a href = "#__codelineno-0-5" id = "__codelineno-0-5" name = "__codelineno-0-5" > < / a > < span class = "w" > < / span > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > scope< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > CoroutineScope< / span > < span class = "p" > (< / span > < span class = "n" > Dispatchers< / span > < span class = "p" > .< / span > < span class = "na" > IO< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-0-6" > < a href = "#__codelineno-0-6" id = "__codelineno-0-6" name = "__codelineno-0-6" > < / a > < span class = "w" > < / span > < span class = "c1" > // Here will be automatically created bot and available inside of lambda where you will setup your bot behaviour< / span >
< / span > < span id = "__span-0-7" > < a href = "#__codelineno-0-7" id = "__codelineno-0-7" name = "__codelineno-0-7" > < / a > < span class = "w" > < / span > < span class = "n" > telegramBotWithBehaviour< / span > < span class = "p" > (< / span >
< / span > < span id = "__span-0-8" > < a href = "#__codelineno-0-8" id = "__codelineno-0-8" name = "__codelineno-0-8" > < / a > < span class = "w" > < / span > < span class = "c1" > // Pass TOKEN inside of your application environment variables< / span >
< / span > < span id = "__span-0-9" > < a href = "#__codelineno-0-9" id = "__codelineno-0-9" name = "__codelineno-0-9" > < / a > < span class = "w" > < / span > < span class = "n" > System< / span > < span class = "p" > .< / span > < span class = "na" > getenv< / span > < span class = "p" > (< / span > < span class = "s" > "TOKEN"< / span > < span class = "p" > ),< / span >
< / span > < span id = "__span-0-10" > < a href = "#__codelineno-0-10" id = "__codelineno-0-10" name = "__codelineno-0-10" > < / a > < span class = "w" > < / span > < span class = "n" > scope< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > scope< / span >
< / span > < span id = "__span-0-11" > < a href = "#__codelineno-0-11" id = "__codelineno-0-11" name = "__codelineno-0-11" > < / a > < span class = "w" > < / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-0-12" > < a href = "#__codelineno-0-12" id = "__codelineno-0-12" name = "__codelineno-0-12" > < / a > < span class = "w" > < / span > < span class = "c1" > // Set up webhooks and start to listen them< / span >
< / span > < span id = "__span-0-13" > < a href = "#__codelineno-0-13" id = "__codelineno-0-13" name = "__codelineno-0-13" > < / a > < span class = "w" > < / span > < span class = "n" > setWebhookInfoAndStartListenWebhooks< / span > < span class = "p" > (< / span >
< / span > < span id = "__span-0-14" > < a href = "#__codelineno-0-14" id = "__codelineno-0-14" name = "__codelineno-0-14" > < / a > < span class = "w" > < / span > < span class = "c1" > // Automatic env which will be passed by heroku to the app< / span >
< / span > < span id = "__span-0-15" > < a href = "#__codelineno-0-15" id = "__codelineno-0-15" name = "__codelineno-0-15" > < / a > < span class = "w" > < / span > < span class = "n" > System< / span > < span class = "p" > .< / span > < span class = "na" > getenv< / span > < span class = "p" > (< / span > < span class = "s" > "PORT"< / span > < span class = "p" > ).< / span > < span class = "na" > toInt< / span > < span class = "p" > (),< / span >
< / span > < span id = "__span-0-16" > < a href = "#__codelineno-0-16" id = "__codelineno-0-16" name = "__codelineno-0-16" > < / a > < span class = "w" > < / span > < span class = "c1" > // Server engine. More info here: https://ktor.io/docs/engines.html< / span >
< / span > < span id = "__span-0-17" > < a href = "#__codelineno-0-17" id = "__codelineno-0-17" name = "__codelineno-0-17" > < / a > < span class = "w" > < / span > < span class = "n" > Tomcat< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-0-18" > < a href = "#__codelineno-0-18" id = "__codelineno-0-18" name = "__codelineno-0-18" > < / a > < span class = "w" > < / span > < span class = "c1" > // Pass URL environment variable via settings of application. It must looks like https://< app name> .herokuapp.com< / span >
< / span > < span id = "__span-0-19" > < a href = "#__codelineno-0-19" id = "__codelineno-0-19" name = "__codelineno-0-19" > < / a > < span class = "w" > < / span > < span class = "n" > SetWebhook< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "si" > ${< / span > < span class = "n" > System< / span > < span class = "p" > .< / span > < span class = "na" > getenv< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "n" > URL< / span > < span class = "s" > "< / span > < span class = "p" > ).< / span > < span class = "na" > removeSuffix< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "o" > /< / span > < span class = "s" > "< / span > < span class = "p" > )< / span > < span class = "si" > }< / span > < span class = "s" > /< / span > < span class = "si" > $< / span > < span class = "n" > subroute< / span > < span class = "s" > "< / span > < span class = "p" > ),< / span >
< / span > < span id = "__span-0-20" > < a href = "#__codelineno-0-20" id = "__codelineno-0-20" name = "__codelineno-0-20" > < / a > < span class = "w" > < / span > < span class = "c1" > // Just callback which will be called when exceptions will happen inside of webhooks< / span >
< / span > < span id = "__span-0-21" > < a href = "#__codelineno-0-21" id = "__codelineno-0-21" name = "__codelineno-0-21" > < / a > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-0-22" > < a href = "#__codelineno-0-22" id = "__codelineno-0-22" name = "__codelineno-0-22" > < / a > < span class = "w" > < / span > < span class = "nb" > it< / span > < span class = "p" > .< / span > < span class = "na" > printStackTrace< / span > < span class = "p" > ()< / span >
< / span > < span id = "__span-0-23" > < a href = "#__codelineno-0-23" id = "__codelineno-0-23" name = "__codelineno-0-23" > < / a > < span class = "w" > < / span > < span class = "p" > },< / span >
< / span > < span id = "__span-0-24" > < a href = "#__codelineno-0-24" id = "__codelineno-0-24" name = "__codelineno-0-24" > < / a > < span class = "w" > < / span > < span class = "c1" > // Set up listen requests from outside< / span >
< / span > < span id = "__span-0-25" > < a href = "#__codelineno-0-25" id = "__codelineno-0-25" name = "__codelineno-0-25" > < / a > < span class = "w" > < / span > < span class = "s" > "0.0.0.0"< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-0-26" > < a href = "#__codelineno-0-26" id = "__codelineno-0-26" name = "__codelineno-0-26" > < / a > < span class = "w" > < / span > < span class = "c1" > // Set up subroute to listen webhooks to< / span >
< / span > < span id = "__span-0-27" > < a href = "#__codelineno-0-27" id = "__codelineno-0-27" name = "__codelineno-0-27" > < / a > < span class = "w" > < / span > < span class = "n" > subroute< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-0-28" > < a href = "#__codelineno-0-28" id = "__codelineno-0-28" name = "__codelineno-0-28" > < / a > < span class = "w" > < / span > < span class = "c1" > // BehaviourContext is the CoroutineScope and it is recommended to pass it inside of webhooks server< / span >
< / span > < span id = "__span-0-29" > < a href = "#__codelineno-0-29" id = "__codelineno-0-29" name = "__codelineno-0-29" > < / a > < span class = "w" > < / span > < span class = "n" > scope< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "k" > this< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-0-30" > < a href = "#__codelineno-0-30" id = "__codelineno-0-30" name = "__codelineno-0-30" > < / a > < span class = "w" > < / span > < span class = "c1" > // BehaviourContext is the FlowsUpdatesFilter and it is recommended to pass its asUpdateReceiver as a block to retrieve all the updates< / span >
< / span > < span id = "__span-0-31" > < a href = "#__codelineno-0-31" id = "__codelineno-0-31" name = "__codelineno-0-31" > < / a > < span class = "w" > < / span > < span class = "n" > block< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > asUpdateReceiver< / span >
< / span > < span id = "__span-0-32" > < a href = "#__codelineno-0-32" id = "__codelineno-0-32" name = "__codelineno-0-32" > < / a > < span class = "w" > < / span > < span class = "p" > )< / span >
< / span > < span id = "__span-0-33" > < a href = "#__codelineno-0-33" id = "__codelineno-0-33" name = "__codelineno-0-33" > < / a > < span class = "w" > < / span > < span class = "c1" > // Test reaction on each command with reply and text `Got it`< / span >
< / span > < span id = "__span-0-34" > < a href = "#__codelineno-0-34" id = "__codelineno-0-34" name = "__codelineno-0-34" > < / a > < span class = "w" > < / span > < span class = "n" > onUnhandledCommand< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-0-35" > < a href = "#__codelineno-0-35" id = "__codelineno-0-35" name = "__codelineno-0-35" > < / a > < span class = "w" > < / span > < span class = "n" > reply< / span > < span class = "p" > (< / span > < span class = "nb" > it< / span > < span class = "p" > ,< / span > < span class = "w" > < / span > < span class = "s" > "Got it"< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-0-36" > < a href = "#__codelineno-0-36" id = "__codelineno-0-36" name = "__codelineno-0-36" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< / span > < span id = "__span-0-37" > < a href = "#__codelineno-0-37" id = "__codelineno-0-37" name = "__codelineno-0-37" > < / a > < span class = "w" > < / span > < span class = "p" > }< / span >
< / span > < span id = "__span-0-38" > < a href = "#__codelineno-0-38" id = "__codelineno-0-38" name = "__codelineno-0-38" > < / a > < span class = "w" > < / span > < span class = "c1" > // Just potentially infinite await of bot completion< / span >
< / span > < span id = "__span-0-39" > < a href = "#__codelineno-0-39" id = "__codelineno-0-39" name = "__codelineno-0-39" > < / a > < span class = "w" > < / span > < span class = "n" > scope< / span > < span class = "p" > .< / span > < span class = "na" > coroutineContext< / span > < span class = "p" > .< / span > < span class = "na" > job< / span > < span class = "p" > .< / span > < span class = "na" > join< / span > < span class = "p" > ()< / span >
< / span > < span id = "__span-0-40" > < a href = "#__codelineno-0-40" id = "__codelineno-0-40" name = "__codelineno-0-40" > < / a > < span class = "p" > }< / span >
2023-06-10 07:53:25 +00:00
< / span > < / code > < / pre > < / div >
2023-07-21 13:56:14 +00:00
< h3 id = "configuration-example-without-behaviour-builder" > Configuration example without Behaviour Builder< a class = "headerlink" href = "#configuration-example-without-behaviour-builder" title = "Permanent link" > ¶< / a > < / h3 >
< div class = "language-kotlin highlight" > < pre > < span > < / span > < code > < span id = "__span-1-1" > < a href = "#__codelineno-1-1" id = "__codelineno-1-1" name = "__codelineno-1-1" > < / a > < span class = "c1" > // This subroute will be used as random webhook subroute to improve security according to the recommendations of Telegram< / span >
< / span > < span id = "__span-1-2" > < a href = "#__codelineno-1-2" id = "__codelineno-1-2" name = "__codelineno-1-2" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > subroute< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > uuid4< / span > < span class = "p" > ().< / span > < span class = "na" > toString< / span > < span class = "p" > ()< / span >
< / span > < span id = "__span-1-3" > < a href = "#__codelineno-1-3" id = "__codelineno-1-3" name = "__codelineno-1-3" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > bot< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > telegramBot< / span > < span class = "p" > (< / span > < span class = "n" > TOKEN< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-1-4" > < a href = "#__codelineno-1-4" id = "__codelineno-1-4" name = "__codelineno-1-4" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > scope< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > CoroutineScope< / span > < span class = "p" > (< / span > < span class = "n" > Dispatchers< / span > < span class = "p" > .< / span > < span class = "na" > Default< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-1-5" > < a href = "#__codelineno-1-5" id = "__codelineno-1-5" name = "__codelineno-1-5" > < / a >
< / span > < span id = "__span-1-6" > < a href = "#__codelineno-1-6" id = "__codelineno-1-6" name = "__codelineno-1-6" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > filter< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > flowsUpdatesFilter< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-1-7" > < a href = "#__codelineno-1-7" id = "__codelineno-1-7" name = "__codelineno-1-7" > < / a > < span class = "w" > < / span > < span class = "n" > messageFlow< / span > < span class = "p" > .< / span > < span class = "na" > onEach< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-1-8" > < a href = "#__codelineno-1-8" id = "__codelineno-1-8" name = "__codelineno-1-8" > < / a > < span class = "w" > < / span > < span class = "n" > println< / span > < span class = "p" > (< / span > < span class = "nb" > it< / span > < span class = "p" > )< / span > < span class = "w" > < / span > < span class = "c1" > // will be printed < / span >
< / span > < span id = "__span-1-9" > < a href = "#__codelineno-1-9" id = "__codelineno-1-9" name = "__codelineno-1-9" > < / a > < span class = "w" > < / span > < span class = "p" > }.< / span > < span class = "na" > launchIn< / span > < span class = "p" > (< / span > < span class = "n" > scope< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-1-10" > < a href = "#__codelineno-1-10" id = "__codelineno-1-10" name = "__codelineno-1-10" > < / a > < span class = "p" > }< / span >
< / span > < span id = "__span-1-11" > < a href = "#__codelineno-1-11" id = "__codelineno-1-11" name = "__codelineno-1-11" > < / a >
< / span > < span id = "__span-1-12" > < a href = "#__codelineno-1-12" id = "__codelineno-1-12" name = "__codelineno-1-12" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > subroute< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > UUID< / span > < span class = "p" > .< / span > < span class = "na" > randomUUID< / span > < span class = "p" > ().< / span > < span class = "na" > toString< / span > < span class = "p" > ()< / span > < span class = "w" > < / span > < span class = "c1" > // It will be used as subpath for security target as recommended by https://core.telegram.org/bots/api#setwebhook< / span >
< / span > < span id = "__span-1-13" > < a href = "#__codelineno-1-13" id = "__codelineno-1-13" name = "__codelineno-1-13" > < / a >
< / span > < span id = "__span-1-14" > < a href = "#__codelineno-1-14" id = "__codelineno-1-14" name = "__codelineno-1-14" > < / a > < span class = "kd" > val< / span > < span class = "w" > < / span > < span class = "nv" > server< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > bot< / span > < span class = "p" > .< / span > < span class = "na" > setWebhookInfoAndStartListenWebhooks< / span > < span class = "p" > (< / span >
< / span > < span id = "__span-1-15" > < a href = "#__codelineno-1-15" id = "__codelineno-1-15" name = "__codelineno-1-15" > < / a > < span class = "w" > < / span > < span class = "c1" > // Automatic env which will be passed by heroku to the app< / span >
< / span > < span id = "__span-1-16" > < a href = "#__codelineno-1-16" id = "__codelineno-1-16" name = "__codelineno-1-16" > < / a > < span class = "w" > < / span > < span class = "n" > System< / span > < span class = "p" > .< / span > < span class = "na" > getenv< / span > < span class = "p" > (< / span > < span class = "s" > "PORT"< / span > < span class = "p" > ).< / span > < span class = "na" > toInt< / span > < span class = "p" > (),< / span >
< / span > < span id = "__span-1-17" > < a href = "#__codelineno-1-17" id = "__codelineno-1-17" name = "__codelineno-1-17" > < / a > < span class = "w" > < / span > < span class = "c1" > // Server engine. More info here: https://ktor.io/docs/engines.html< / span >
< / span > < span id = "__span-1-18" > < a href = "#__codelineno-1-18" id = "__codelineno-1-18" name = "__codelineno-1-18" > < / a > < span class = "w" > < / span > < span class = "n" > Tomcat< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-1-19" > < a href = "#__codelineno-1-19" id = "__codelineno-1-19" name = "__codelineno-1-19" > < / a > < span class = "w" > < / span > < span class = "c1" > // Pass URL environment variable via settings of application. It must looks like https://< app name> .herokuapp.com< / span >
< / span > < span id = "__span-1-20" > < a href = "#__codelineno-1-20" id = "__codelineno-1-20" name = "__codelineno-1-20" > < / a > < span class = "w" > < / span > < span class = "n" > SetWebhook< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "si" > ${< / span > < span class = "n" > System< / span > < span class = "p" > .< / span > < span class = "na" > getenv< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "n" > URL< / span > < span class = "s" > "< / span > < span class = "p" > ).< / span > < span class = "na" > removeSuffix< / span > < span class = "p" > (< / span > < span class = "s" > "< / span > < span class = "o" > /< / span > < span class = "s" > "< / span > < span class = "p" > )< / span > < span class = "si" > }< / span > < span class = "s" > /< / span > < span class = "si" > $< / span > < span class = "n" > subroute< / span > < span class = "s" > "< / span > < span class = "p" > ),< / span >
< / span > < span id = "__span-1-21" > < a href = "#__codelineno-1-21" id = "__codelineno-1-21" name = "__codelineno-1-21" > < / a > < span class = "w" > < / span > < span class = "c1" > // Just callback which will be called when exceptions will happen inside of webhooks< / span >
< / span > < span id = "__span-1-22" > < a href = "#__codelineno-1-22" id = "__codelineno-1-22" name = "__codelineno-1-22" > < / a > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-1-23" > < a href = "#__codelineno-1-23" id = "__codelineno-1-23" name = "__codelineno-1-23" > < / a > < span class = "w" > < / span > < span class = "nb" > it< / span > < span class = "p" > .< / span > < span class = "na" > printStackTrace< / span > < span class = "p" > ()< / span >
< / span > < span id = "__span-1-24" > < a href = "#__codelineno-1-24" id = "__codelineno-1-24" name = "__codelineno-1-24" > < / a > < span class = "w" > < / span > < span class = "p" > },< / span >
< / span > < span id = "__span-1-25" > < a href = "#__codelineno-1-25" id = "__codelineno-1-25" name = "__codelineno-1-25" > < / a > < span class = "w" > < / span > < span class = "c1" > // Set up listen requests from outside< / span >
< / span > < span id = "__span-1-26" > < a href = "#__codelineno-1-26" id = "__codelineno-1-26" name = "__codelineno-1-26" > < / a > < span class = "w" > < / span > < span class = "s" > "0.0.0.0"< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-1-27" > < a href = "#__codelineno-1-27" id = "__codelineno-1-27" name = "__codelineno-1-27" > < / a > < span class = "w" > < / span > < span class = "c1" > // Set up subroute to listen webhooks to< / span >
< / span > < span id = "__span-1-28" > < a href = "#__codelineno-1-28" id = "__codelineno-1-28" name = "__codelineno-1-28" > < / a > < span class = "w" > < / span > < span class = "n" > subroute< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-1-29" > < a href = "#__codelineno-1-29" id = "__codelineno-1-29" name = "__codelineno-1-29" > < / a > < span class = "w" > < / span > < span class = "n" > scope< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > scope< / span > < span class = "p" > ,< / span >
< / span > < span id = "__span-1-30" > < a href = "#__codelineno-1-30" id = "__codelineno-1-30" name = "__codelineno-1-30" > < / a > < span class = "w" > < / span > < span class = "n" > block< / span > < span class = "w" > < / span > < span class = "o" > =< / span > < span class = "w" > < / span > < span class = "n" > filter< / span > < span class = "p" > .< / span > < span class = "na" > asUpdateReceiver< / span >
< / span > < span id = "__span-1-31" > < a href = "#__codelineno-1-31" id = "__codelineno-1-31" name = "__codelineno-1-31" > < / a > < span class = "p" > )< / span >
< / span > < span id = "__span-1-32" > < a href = "#__codelineno-1-32" id = "__codelineno-1-32" name = "__codelineno-1-32" > < / a >
< / span > < span id = "__span-1-33" > < a href = "#__codelineno-1-33" id = "__codelineno-1-33" name = "__codelineno-1-33" > < / a > < span class = "n" > server< / span > < span class = "p" > .< / span > < span class = "na" > environment< / span > < span class = "p" > .< / span > < span class = "na" > connectors< / span > < span class = "p" > .< / span > < span class = "na" > forEach< / span > < span class = "w" > < / span > < span class = "p" > {< / span >
< / span > < span id = "__span-1-34" > < a href = "#__codelineno-1-34" id = "__codelineno-1-34" name = "__codelineno-1-34" > < / a > < span class = "w" > < / span > < span class = "n" > println< / span > < span class = "p" > (< / span > < span class = "nb" > it< / span > < span class = "p" > )< / span >
< / span > < span id = "__span-1-35" > < a href = "#__codelineno-1-35" id = "__codelineno-1-35" name = "__codelineno-1-35" > < / a > < span class = "p" > }< / span >
< / span > < span id = "__span-1-36" > < a href = "#__codelineno-1-36" id = "__codelineno-1-36" name = "__codelineno-1-36" > < / a > < span class = "n" > server< / span > < span class = "p" > .< / span > < span class = "na" > start< / span > < span class = "p" > (< / span > < span class = "kc" > false< / span > < span class = "p" > )< / span >
2023-06-10 07:53:25 +00:00
< / span > < / code > < / pre > < / div >
2023-07-21 13:56:14 +00:00
< / article >
< / div >
< / div >
< button class = "md-top md-icon" data-md-component = "top" hidden = "" type = "button" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z" > < / path > < / svg >
2023-06-09 20:03:53 +00:00
Back to top
< / button >
2023-07-21 13:56:14 +00:00
< / main >
< footer class = "md-footer" >
< nav aria-label = "Footer" class = "md-footer__inner md-grid" >
< a aria-label = "Previous: Webhooks" class = "md-footer__link md-footer__link--prev" href = "webhooks.html" rel = "prev" >
< div class = "md-footer__button md-icon" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z" > < / path > < / svg >
< / div >
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
2023-06-09 20:03:53 +00:00
Previous
< / span >
2023-07-21 13:56:14 +00:00
< div class = "md-ellipsis" >
2023-06-09 20:03:53 +00:00
Webhooks
< / div >
2023-07-21 13:56:14 +00:00
< / div >
< / a >
< a aria-label = "Next: API Extensions" class = "md-footer__link md-footer__link--next" href = "../logic/api-extensions.html" rel = "next" >
< div class = "md-footer__title" >
< span class = "md-footer__direction" >
2023-06-09 20:03:53 +00:00
Next
< / span >
2023-07-21 13:56:14 +00:00
< div class = "md-ellipsis" >
2023-06-09 20:03:53 +00:00
API Extensions
< / div >
2023-07-21 13:56:14 +00:00
< / div >
< div class = "md-footer__button md-icon" >
< svg viewbox = "0 0 24 24" xmlns = "http://www.w3.org/2000/svg" > < path d = "M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z" > < / path > < / svg >
< / div >
< / a >
< / nav >
< div class = "md-footer-meta md-typeset" >
< div class = "md-footer-meta__inner md-grid" >
< div class = "md-copyright" >
2023-06-09 20:03:53 +00:00
Made with
2023-07-21 13:56:14 +00:00
< a href = "https://squidfunk.github.io/mkdocs-material/" rel = "noopener" target = "_blank" >
2023-06-09 20:03:53 +00:00
Material for MkDocs
< / a >
2023-06-10 11:01:37 +00:00
< / div >
2023-07-21 13:56:14 +00:00
< div class = "md-social" >
< a class = "md-social__link" href = "https://github.com/InsanusMokrassar" rel = "noopener" target = "_blank" title = "github.com" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 496 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / a >
< a class = "md-social__link" href = "https://hub.docker.com/r/insanusmokrassar" rel = "noopener" target = "_blank" title = "hub.docker.com" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 640 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / a >
< a class = "md-social__link" href = "https://t.me/InsanusMokrassar" rel = "noopener" target = "_blank" title = "t.me" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 496 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M248 8C111.033 8 0 119.033 0 256s111.033 248 248 248 248-111.033 248-248S384.967 8 248 8Zm114.952 168.66c-3.732 39.215-19.881 134.378-28.1 178.3-3.476 18.584-10.322 24.816-16.948 25.425-14.4 1.326-25.338-9.517-39.287-18.661-21.827-14.308-34.158-23.215-55.346-37.177-24.485-16.135-8.612-25 5.342-39.5 3.652-3.793 67.107-61.51 68.335-66.746.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608 69.142-14.845 10.194-26.894 9.934c-8.855-.191-25.888-5.006-38.551-9.123-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7 18.45-13.7 108.446-47.248 144.628-62.3c68.872-28.647 83.183-33.623 92.511-33.789 2.052-.034 6.639.474 9.61 2.885a10.452 10.452 0 0 1 3.53 6.716 43.765 43.765 0 0 1 .417 9.769Z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / a >
< a class = "md-social__link" href = "https://twitter.com/InsanusMokrassa" rel = "noopener" target = "_blank" title = "twitter.com" >
2023-09-02 22:14:53 +00:00
< svg viewbox = "0 0 512 512" xmlns = "http://www.w3.org/2000/svg" > <!-- ! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --> < path d = "M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z" > < / path > < / svg >
2023-07-21 13:56:14 +00:00
< / a >
< / div >
< / div >
2023-06-09 20:03:53 +00:00
< / div >
< / footer >
2023-07-21 13:56:14 +00:00
< / div >
< div class = "md-dialog" data-md-component = "dialog" >
< div class = "md-dialog__inner md-typeset" > < / div >
< / div >
2023-09-02 22:14:53 +00:00
< script id = "__config" type = "application/json" > { "base" : "../.." , "features" : [ "announce.dismiss" , "content.action.edit" , "content.action.view" , "content.code.annotate" , "content.code.copy" , "content.tooltips" , "navigation.footer" , "navigation.indexes" , "navigation.sections" , "navigation.tabs" , "navigation.top" , "navigation.tracking" , "search.highlight" , "search.share" , "search.suggest" , "toc.follow" ] , "search" : "../../assets/javascripts/workers/search.dfff1995.min.js" , "translations" : { "clipboard.copied" : "Copied to clipboard" , "clipboard.copy" : "Copy to clipboard" , "search.result.more.one" : "1 more on this page" , "search.result.more.other" : "# more on this page" , "search.result.none" : "No matching documents" , "search.result.one" : "1 matching document" , "search.result.other" : "# matching documents" , "search.result.placeholder" : "Type to start searching" , "search.result.term.missing" : "Missing" , "select.version" : "Select version" } } < / script >
< script src = "../../assets/javascripts/bundle.dff1b7c8.min.js" > < / script >
2023-07-22 16:31:39 +00:00
< script src = "../../resources/js/mermaid.min.js" > < / script >
2023-07-21 13:56:14 +00:00
< script src = "../../resources/js/mermaid_dark_light_switcher.js" > < / script >
< / body >
2023-06-09 20:03:53 +00:00
< / html >