lex-telegram 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 125ec7f31237fe0857ad4fc3a225f5b6c4e6a3ffd705b0cf7d1abd431c1ee925
4
+ data.tar.gz: 8d31d6c1d43708a6a7553b327bd64040b84ceb2e8dfb626f5f4ddfbdc2329c6c
5
+ SHA512:
6
+ metadata.gz: 59e2e8020a74cffc65148abeb3233c03a6c0a687aad7fd623cd44281b98c2b7635ee3d3fcd104b10295231b540c98bc03bb5287312cd14ff3074d4265b052bd8
7
+ data.tar.gz: e465e24fb47cf25e1036381359bae7d0582d8ec64c3e08e6018b2fa0862c2944180ab54fb23c0aa6d94e94e9b8505d1c383a4c82fa051971a6dcbc86cd342d32
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+
7
+ jobs:
8
+ ci:
9
+ uses: LegionIO/.github/.github/workflows/ci.yml@main
10
+
11
+ release:
12
+ needs: ci
13
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
14
+ uses: LegionIO/.github/.github/workflows/release.yml@main
15
+ secrets:
16
+ rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Layout/LineLength:
7
+ Max: 160
8
+
9
+ Layout/SpaceAroundEqualsInParameterDefault:
10
+ EnforcedStyle: space
11
+
12
+ Layout/HashAlignment:
13
+ EnforcedHashRocketStyle: table
14
+ EnforcedColonStyle: table
15
+
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+
19
+ Metrics/ClassLength:
20
+ Max: 1500
21
+
22
+ Metrics/ModuleLength:
23
+ Max: 1500
24
+
25
+ Metrics/BlockLength:
26
+ Max: 40
27
+ Exclude:
28
+ - 'spec/**/*'
29
+
30
+ Metrics/ParameterLists:
31
+ Max: 10
32
+
33
+ Metrics/AbcSize:
34
+ Max: 60
35
+
36
+ Metrics/CyclomaticComplexity:
37
+ Max: 15
38
+
39
+ Metrics/PerceivedComplexity:
40
+ Max: 17
41
+
42
+ Style/Documentation:
43
+ Enabled: false
44
+
45
+ Style/SymbolArray:
46
+ Enabled: true
47
+
48
+ Style/FrozenStringLiteralComment:
49
+ Enabled: true
50
+ EnforcedStyle: always
51
+
52
+ Naming/FileName:
53
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-03-22
4
+
5
+ ### Added
6
+ - Initial release
7
+ - `Helpers::Client` — Faraday connection builder targeting Telegram Bot API with token auth
8
+ - `Runners::Messages` — send_message, edit_message, delete_message, forward_message
9
+ - `Runners::Updates` — get_updates, set_webhook, delete_webhook, get_webhook_info
10
+ - Standalone `Client` class for use outside the Legion framework
data/CLAUDE.md ADDED
@@ -0,0 +1,72 @@
1
+ # lex-telegram: Telegram Bot API Integration for LegionIO
2
+
3
+ **Repository Level 4 Documentation**
4
+ - **Parent**: `/Users/miverso2/rubymine/legion/extensions-other/CLAUDE.md`
5
+
6
+ ## Purpose
7
+
8
+ Legion extension for interacting with the Telegram Bot API. Supports sending, editing, deleting, and forwarding messages, as well as managing updates (long polling and webhooks).
9
+
10
+ **GitHub**: https://github.com/LegionIO/lex-telegram
11
+ **Gem**: `lex-telegram`
12
+ **Version**: 0.1.0
13
+ **License**: MIT
14
+ **Ruby**: >= 3.4
15
+
16
+ ## Architecture
17
+
18
+ ### Runners
19
+
20
+ | Runner | Methods | Description |
21
+ |--------|---------|-------------|
22
+ | `Messages` | `send_message`, `edit_message`, `delete_message`, `forward_message` | Core messaging operations |
23
+ | `Updates` | `get_updates`, `set_webhook`, `delete_webhook`, `get_webhook_info` | Bot update retrieval and webhook management |
24
+
25
+ ### Helpers
26
+
27
+ - `Helpers::Client` — Faraday connection factory. Builds connection to `https://api.telegram.org/bot<token>/`. Token resolved from kwargs or `Legion::Settings[:'lex-telegram'][:token]`.
28
+
29
+ ### Standalone Client
30
+
31
+ ```ruby
32
+ client = Legion::Extensions::Telegram::Client.new(token: 'BOT_TOKEN')
33
+ client.send_message(chat_id: 12345, text: 'Hello from Legion!')
34
+ client.get_updates(limit: 10, timeout: 30)
35
+ ```
36
+
37
+ ## Authentication
38
+
39
+ Bot token in URL path per Telegram Bot API convention: `https://api.telegram.org/bot<TOKEN>/<method>`.
40
+
41
+ ## Settings
42
+
43
+ ```json
44
+ {
45
+ "lex-telegram": {
46
+ "token": "vault://secret/telegram#bot_token"
47
+ }
48
+ }
49
+ ```
50
+
51
+ ## File Map
52
+
53
+ | Path | Purpose |
54
+ |------|---------|
55
+ | `lib/legion/extensions/telegram.rb` | Entry point |
56
+ | `lib/legion/extensions/telegram/version.rb` | Version constant |
57
+ | `lib/legion/extensions/telegram/helpers/client.rb` | Faraday connection factory |
58
+ | `lib/legion/extensions/telegram/runners/messages.rb` | Message CRUD operations |
59
+ | `lib/legion/extensions/telegram/runners/updates.rb` | Update retrieval and webhook management |
60
+ | `lib/legion/extensions/telegram/client.rb` | Standalone Client class |
61
+
62
+ ## Development
63
+
64
+ ```bash
65
+ bundle install
66
+ bundle exec rspec # 14 examples, 0 failures
67
+ bundle exec rubocop # 0 offenses
68
+ ```
69
+
70
+ ---
71
+
72
+ **Maintained By**: Matthew Iverson (@Esity)
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rake', '~> 12.0'
8
+ gem 'rspec', '~> 3.0'
9
+ gem 'rspec_junit_formatter'
10
+ gem 'rubocop'
11
+ gem 'rubocop-rspec'
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/telegram/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-telegram'
7
+ spec.version = Legion::Extensions::Telegram::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX::Telegram'
12
+ spec.description = 'Used to connect Legion to Telegram via the Bot API'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-telegram'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-telegram'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-telegram/blob/main/CHANGELOG.md'
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
+
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = 'exe'
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ['lib']
28
+
29
+ spec.add_dependency 'faraday', '>= 2.0'
30
+ spec.add_dependency 'faraday-multipart', '~> 1.0'
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers/client'
4
+ require_relative 'runners/messages'
5
+ require_relative 'runners/updates'
6
+
7
+ module Legion
8
+ module Extensions
9
+ module Telegram
10
+ class Client
11
+ include Helpers::Client
12
+ include Runners::Messages
13
+ include Runners::Updates
14
+
15
+ attr_reader :opts
16
+
17
+ def initialize(token:, **extra)
18
+ @opts = { token: token, **extra }
19
+ end
20
+
21
+ def settings
22
+ { options: @opts }
23
+ end
24
+
25
+ def connection(**override)
26
+ super(**@opts, **override)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Telegram
8
+ module Helpers
9
+ module Client
10
+ def connection(token: nil, **_opts)
11
+ t = if token
12
+ token
13
+ elsif defined?(Legion::Settings) && Legion::Settings.respond_to?(:dig)
14
+ Legion::Settings.dig(:'lex-telegram', :token)
15
+ end
16
+ Faraday.new(url: "https://api.telegram.org/bot#{t}") do |f|
17
+ f.request :json
18
+ f.response :json, content_type: /\bjson$/
19
+ f.adapter Faraday.default_adapter
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Telegram
6
+ module Runners
7
+ module Messages
8
+ def send_message(chat_id:, text:, **opts)
9
+ conn = opts.delete(:connection) || connection(**opts)
10
+ body = { chat_id: chat_id, text: text }
11
+ body[:parse_mode] = opts[:parse_mode] if opts[:parse_mode]
12
+ body[:reply_to_message_id] = opts[:reply_to_message_id] if opts[:reply_to_message_id]
13
+ resp = conn.post('/sendMessage', body)
14
+ resp.body
15
+ end
16
+
17
+ def edit_message(chat_id:, message_id:, text:, **opts)
18
+ conn = opts.delete(:connection) || connection(**opts)
19
+ body = { chat_id: chat_id, message_id: message_id, text: text }
20
+ body[:parse_mode] = opts[:parse_mode] if opts[:parse_mode]
21
+ resp = conn.post('/editMessageText', body)
22
+ resp.body
23
+ end
24
+
25
+ def delete_message(chat_id:, message_id:, **opts)
26
+ conn = opts.delete(:connection) || connection(**opts)
27
+ resp = conn.post('/deleteMessage', { chat_id: chat_id, message_id: message_id })
28
+ deleted = resp.body.is_a?(Hash) && resp.body['result'] == true
29
+ { deleted: deleted, message_id: message_id }
30
+ end
31
+
32
+ def forward_message(chat_id:, from_chat_id:, message_id:, **opts)
33
+ conn = opts.delete(:connection) || connection(**opts)
34
+ body = { chat_id: chat_id, from_chat_id: from_chat_id, message_id: message_id }
35
+ resp = conn.post('/forwardMessage', body)
36
+ resp.body
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Telegram
6
+ module Runners
7
+ module Updates
8
+ def get_updates(offset: nil, limit: 100, timeout: 0, **opts)
9
+ conn = opts.delete(:connection) || connection(**opts)
10
+ params = { limit: limit, timeout: timeout }
11
+ params[:offset] = offset if offset
12
+ resp = conn.get('/getUpdates', params)
13
+ resp.body
14
+ end
15
+
16
+ def set_webhook(url:, **opts)
17
+ conn = opts.delete(:connection) || connection(**opts)
18
+ body = { url: url }
19
+ body[:max_connections] = opts[:max_connections] if opts[:max_connections]
20
+ body[:allowed_updates] = opts[:allowed_updates] if opts[:allowed_updates]
21
+ body[:secret_token] = opts[:secret_token] if opts[:secret_token]
22
+ resp = conn.post('/setWebhook', body)
23
+ resp.body
24
+ end
25
+
26
+ def delete_webhook(**opts)
27
+ conn = opts.delete(:connection) || connection(**opts)
28
+ resp = conn.post('/deleteWebhook', {})
29
+ resp.body
30
+ end
31
+
32
+ def get_webhook_info(**opts)
33
+ conn = opts.delete(:connection) || connection(**opts)
34
+ resp = conn.get('/getWebhookInfo')
35
+ resp.body
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Telegram
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/telegram/version'
4
+ require 'legion/extensions/telegram/helpers/client'
5
+ require 'legion/extensions/telegram/runners/messages'
6
+ require 'legion/extensions/telegram/runners/updates'
7
+ require 'legion/extensions/telegram/client'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Telegram
12
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
13
+ end
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-telegram
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: faraday-multipart
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ description: Used to connect Legion to Telegram via the Bot API
41
+ email:
42
+ - matthewdiverson@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".github/workflows/ci.yml"
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".rubocop.yml"
51
+ - CHANGELOG.md
52
+ - CLAUDE.md
53
+ - Gemfile
54
+ - lex-telegram.gemspec
55
+ - lib/legion/extensions/telegram.rb
56
+ - lib/legion/extensions/telegram/client.rb
57
+ - lib/legion/extensions/telegram/helpers/client.rb
58
+ - lib/legion/extensions/telegram/runners/messages.rb
59
+ - lib/legion/extensions/telegram/runners/updates.rb
60
+ - lib/legion/extensions/telegram/version.rb
61
+ homepage: https://github.com/LegionIO/lex-telegram
62
+ licenses:
63
+ - MIT
64
+ metadata:
65
+ homepage_uri: https://github.com/LegionIO/lex-telegram
66
+ source_code_uri: https://github.com/LegionIO/lex-telegram
67
+ changelog_uri: https://github.com/LegionIO/lex-telegram/blob/main/CHANGELOG.md
68
+ rubygems_mfa_required: 'true'
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '3.4'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubygems_version: 3.6.9
84
+ specification_version: 4
85
+ summary: LEX::Telegram
86
+ test_files: []