Class: Telepost

Inherits:
Object
  • Object
show all
Defined in:
lib/telepost.rb

Overview

Telepost is a simple gateway to Telegram, which can post messages and respond to primitive requests:

require 'telepost'
tp = Telepost.new('... secret token ...')
tp.run do |chat, msg|
  # Reply to the message via tp.post(msg, chat)
end

For more information read README file.

Author

Yegor Bugayenko (yegor256@gmail.com)

Copyright

Copyright © 2018-2026 Yegor Bugayenko

License

MIT

Defined Under Namespace

Classes: CantPost, Fake

Constant Summary collapse

PHOTO_EXTENSIONS =
%w[.jpg .jpeg .png .gif .webp].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(token, chats: []) ⇒ Telepost

Makes a new object. To obtain a token you should talk to the @BotFather in Telegram.

Parameters:

  • token (String)

    Telegram bot token

  • chats (Array<Integer>) (defaults to: [])

    Optional list of chat IDs



76
77
78
79
80
# File 'lib/telepost.rb', line 76

def initialize(token, chats: [])
  @token = token
  @chats = chats
  @bot = Telegram::Bot::Client.new(@token)
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



69
70
71
# File 'lib/telepost.rb', line 69

def client
  @client
end

Instance Method Details

#attach(chat, file, caption: nil, parse_mode: 'Markdown') ⇒ Telegram::Bot::Types::Message

Attach a file (as a Telegram document) to the chat. The file argument can either be a path (String) or an open IO/File. The filename shown in Telegram comes from the basename of the path.

When file is an Array, all of its items are posted as a single grouped message (a Telegram “album”) via sendMediaGroup. Items with an image extension are wrapped in InputMediaPhoto, the rest in InputMediaDocument. The caption is attached to the first item only, so the album shows one caption.

Parameters:

  • chat (Integer, String)

    Chat ID or channel name

  • file (String, File, IO, Array)

    File (or array of files) to attach

  • caption (String, nil) (defaults to: nil)

    Optional caption for the attachment

  • parse_mode (String) (defaults to: 'Markdown')

    Parse mode used for the caption

Returns:

  • (Telegram::Bot::Types::Message)

    The sent message object



139
140
141
142
143
144
145
# File 'lib/telepost.rb', line 139

def attach(chat, file, caption: nil, parse_mode: 'Markdown')
  return album(chat, file, caption:, parse_mode:) if file.is_a?(Array)
  io = upload(file)
  @bot.api.send_document(chat_id: chat, document: io, caption:, parse_mode:)
ensure
  io.close if file.is_a?(String) && io.respond_to?(:close)
end

#post(chat, *lines, parse_mode: 'Markdown') ⇒ Telegram::Bot::Types::Message

Post a single message to the designated chat room. The chat argument can either be an integer, if you know the chat ID, or the name of the channel (your bot has to be the admin there). The lines provided will be concatenated with a space between them.

Parameters:

  • chat (Integer, String)

    Chat ID or channel name

  • lines (Array<String>)

    Message lines to send

Returns:

  • (Telegram::Bot::Types::Message)

    The sent message object



120
121
122
# File 'lib/telepost.rb', line 120

def post(chat, *lines, parse_mode: 'Markdown')
  @bot.api.send_message(chat_id: chat, parse_mode:, disable_web_page_preview: true, text: lines.join(' '))
end

#run {|Integer, String| ... } ⇒ void

This method returns an undefined value.

You can run a chat bot to listen to the messages coming to it, in a separate thread.

Yields:

  • (Integer, String)

    Yields chat ID and message text

Raises:

  • (RuntimeError)

    If no block is given



88
89
90
91
92
93
94
95
96
97
# File 'lib/telepost.rb', line 88

def run
  raise(RuntimeError, 'Block must be given') unless block_given?
  @bot.listen do |message|
    next unless message.respond_to?(:chat)
    next if message.chat.nil?
    yield(message.chat.id, message.respond_to?(:text) ? message.text : '')
  end
rescue Net::OpenTimeout
  retry
end

#spam(*lines) ⇒ void

This method returns an undefined value.

Send the message (lines will be concatenated with a space between them) to the chats provided in the constructor and encapsulated.

Parameters:

  • lines (Array<String>)

    Message lines to send



105
106
107
108
109
# File 'lib/telepost.rb', line 105

def spam(*lines)
  @chats.each do |chat|
    post(chat, *lines)
  end
end