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 +7 -0
- data/.github/workflows/ci.yml +16 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +53 -0
- data/CHANGELOG.md +10 -0
- data/CLAUDE.md +72 -0
- data/Gemfile +11 -0
- data/lex-telegram.gemspec +31 -0
- data/lib/legion/extensions/telegram/client.rb +31 -0
- data/lib/legion/extensions/telegram/helpers/client.rb +26 -0
- data/lib/legion/extensions/telegram/runners/messages.rb +42 -0
- data/lib/legion/extensions/telegram/runners/updates.rb +41 -0
- data/lib/legion/extensions/telegram/version.rb +9 -0
- data/lib/legion/extensions/telegram.rb +15 -0
- metadata +86 -0
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
data/.rspec
ADDED
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,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,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: []
|