telegem 3.2.1 → 3.2.2
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 +4 -4
- data/bin/telegem-ssl +0 -0
- data/lib/plugins/file_extract.rb +172 -66
- data/lib/telegem.code-workspace +8 -0
- data/lib/telegem.rb +1 -1
- metadata +52 -23
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3e38340f8acfbe77b677a30960ba7f5f7e074b7fe373890b676d492f30141207
|
|
4
|
+
data.tar.gz: 9ad810bb1fb0e63af1de6a1120f8adcc791e2c40765446731e67eee2d4b82d6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ebea1b6df44831d3fbb912f345cce9f5bee57f9e887fa39df1f7dd8056b5a360f7703b56c5f591de17e13aa105b9a911737c00364bc48ea21af974dcf19382c1
|
|
7
|
+
data.tar.gz: 2727f777908d295aff07fe535c11a5a6238cb841e2f4944ca7b26973ed87cb140671aa45cc2d3cf937cc422a507b31b7f69e165e1641c5255691bc2d930b7060
|
data/bin/telegem-ssl
CHANGED
|
File without changes
|
data/lib/plugins/file_extract.rb
CHANGED
|
@@ -1,97 +1,203 @@
|
|
|
1
|
-
|
|
1
|
+
#frozen_string_literal: true
|
|
2
2
|
require 'pdf/reader'
|
|
3
|
-
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'tempfile'
|
|
5
|
+
require 'securerandom'
|
|
4
6
|
module Telegem
|
|
5
7
|
module Plugins
|
|
6
|
-
class
|
|
8
|
+
class FileExtract
|
|
7
9
|
def initialize(bot, file_id, **options)
|
|
8
10
|
@bot = bot
|
|
9
11
|
@file_id = file_id
|
|
10
12
|
@options = {
|
|
11
|
-
timeout: 15,
|
|
12
13
|
auto_delete: true,
|
|
13
|
-
|
|
14
|
+
max_file_size: 50 * 1024 * 1024,
|
|
15
|
+
timeout: 60
|
|
14
16
|
}.merge(options)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
@temp_file = nil
|
|
18
|
+
@detected_type = nil
|
|
19
|
+
end
|
|
20
|
+
def extract
|
|
21
|
+
download_if_needed
|
|
22
|
+
detect_type
|
|
23
|
+
case @detected_type
|
|
24
|
+
when :pdf then extract_pdf
|
|
25
|
+
when :json then extract_json
|
|
26
|
+
when :html then extract_html
|
|
27
|
+
when :txt, :md, :csv then extract_text
|
|
28
|
+
else
|
|
29
|
+
{
|
|
30
|
+
success: false,
|
|
31
|
+
error: "Unsupported file type: #{@detected_type}"
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
private
|
|
36
|
+
def download_if_needed
|
|
37
|
+
return if @temp_file
|
|
38
|
+
@temp_file = Tempfile.new(['telegem_', SecureRandom.hex(6)])
|
|
39
|
+
unless
|
|
40
|
+
@bot.api.download(@file_id, @temp_file.path)
|
|
41
|
+
raise "Failed to download file with ID #{@file_id}"
|
|
42
|
+
end
|
|
43
|
+
@temp_file.close
|
|
17
44
|
end
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
45
|
+
def detect_type
|
|
46
|
+
return @detected_type if @detected_type
|
|
47
|
+
pll = File.read(@temp_file.path, 10) rescue nil
|
|
48
|
+
case pll
|
|
49
|
+
when "%PDF" then @detected_type = :pdf
|
|
50
|
+
when "{", "[" then @detected_type = :json
|
|
51
|
+
when "<!DO", "<ht" then @detected_type = :html
|
|
52
|
+
else
|
|
53
|
+
ext = File.extname(@temp_file.path).downcase
|
|
54
|
+
@detected_type = case ext
|
|
55
|
+
when ".txt" then :txt
|
|
56
|
+
when ".md" then :md
|
|
57
|
+
when ".csv" then :csv
|
|
58
|
+
else :unknown
|
|
59
|
+
end
|
|
30
60
|
end
|
|
61
|
+
@detected_type
|
|
31
62
|
end
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{ error: "pdf is empty" }
|
|
41
|
-
else
|
|
42
|
-
result = {
|
|
43
|
-
success: true,
|
|
44
|
-
content: text,
|
|
45
|
-
pages: reader.page_count,
|
|
63
|
+
def extract_pdf
|
|
64
|
+
begin
|
|
65
|
+
reader = PDF::Reader.new(@temp_file.path)
|
|
66
|
+
text = reader.pages.map(&:text).join("\n")
|
|
67
|
+
if text.strip.empty?
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: "PDF contains no extractable text"
|
|
46
71
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
72
|
+
else
|
|
73
|
+
{
|
|
74
|
+
success: true,
|
|
75
|
+
type: :pdf,
|
|
76
|
+
content: text,
|
|
77
|
+
metadata: {
|
|
78
|
+
page_count: reader.page_count,
|
|
79
|
+
info: reader.info
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
end
|
|
54
83
|
rescue => e
|
|
55
|
-
{
|
|
56
|
-
|
|
57
|
-
|
|
84
|
+
{
|
|
85
|
+
success: false,
|
|
86
|
+
error: "Failed to extract PDF: #{e.message}"
|
|
87
|
+
}
|
|
88
|
+
rescue LoadError
|
|
89
|
+
{
|
|
90
|
+
success: false,
|
|
91
|
+
error: "PDF extraction requires the 'pdf-reader' gem. Please add it to your Gemfile."
|
|
92
|
+
}
|
|
93
|
+
rescue PDF::Reader::MalformedPDFError => e
|
|
94
|
+
{
|
|
95
|
+
success: false,
|
|
96
|
+
error: "Malformed PDF: #{e.message}"
|
|
97
|
+
}
|
|
98
|
+
rescue PDF::Reader::UnsupportedFeatureError => e
|
|
99
|
+
{
|
|
100
|
+
success: false,
|
|
101
|
+
error: "Unsupported PDF feature: #{e.message}"
|
|
102
|
+
}
|
|
103
|
+
rescue PDF::Reader::EncryptedPDFError => e
|
|
104
|
+
{
|
|
105
|
+
success: false,
|
|
106
|
+
error: "Encrypted PDF: #{e.message}"
|
|
107
|
+
}
|
|
108
|
+
ensure
|
|
109
|
+
cleanup if @options[:auto_delete]
|
|
58
110
|
end
|
|
59
|
-
end
|
|
111
|
+
end
|
|
112
|
+
def extract_json
|
|
113
|
+
begin
|
|
114
|
+
content = File.read(@temp_file.path)
|
|
115
|
+
data = JSON.parse(content)
|
|
116
|
+
if data.nil? || (data.is_a?(Hash) && data.empty?) || (data.is_a?(Array) && data.empty?)
|
|
117
|
+
return {
|
|
118
|
+
success: false,
|
|
119
|
+
error: "JSON file is empty or contains no data"
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
{
|
|
123
|
+
success: true,
|
|
124
|
+
type: :json,
|
|
125
|
+
content: data,
|
|
126
|
+
metadata: {
|
|
127
|
+
size: content.size,
|
|
128
|
+
keys: data.is_a?(Hash) ? data.keys : nil,
|
|
129
|
+
length: data.is_a?(Array) ? data.length : nil
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
end
|
|
133
|
+
rescue JSON::ParserError => e
|
|
134
|
+
{
|
|
135
|
+
success: false,
|
|
136
|
+
error: "Invalid JSON format: #{e.message}"
|
|
137
|
+
}
|
|
138
|
+
ensure
|
|
139
|
+
cleanup if @options[:auto_delete]
|
|
140
|
+
end
|
|
60
141
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
142
|
+
def extract_html
|
|
143
|
+
begin
|
|
144
|
+
content = File.read(@temp_file.path)
|
|
145
|
+
if content.strip.empty?
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
error: "HTML file is empty"
|
|
149
|
+
}
|
|
150
|
+
end
|
|
65
151
|
{
|
|
66
152
|
success: true,
|
|
67
|
-
|
|
153
|
+
type: :html,
|
|
154
|
+
content: content,
|
|
155
|
+
metadata: {
|
|
156
|
+
size: content.size,
|
|
157
|
+
title: content[/<title>(.*?)<\/title>/i, 1]
|
|
158
|
+
}
|
|
68
159
|
}
|
|
69
|
-
|
|
160
|
+
rescue => e
|
|
70
161
|
{
|
|
71
|
-
|
|
162
|
+
success: false,
|
|
163
|
+
error: "Failed to extract HTML: #{e.message}"
|
|
72
164
|
}
|
|
165
|
+
ensure
|
|
166
|
+
cleanup if @options[:auto_delete]
|
|
73
167
|
end
|
|
74
168
|
end
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
169
|
+
def extract_text
|
|
170
|
+
begin
|
|
171
|
+
content = File.read(@temp_file.path)
|
|
172
|
+
if content.strip.empty?
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
error: "Text file is empty"
|
|
176
|
+
}
|
|
177
|
+
end
|
|
81
178
|
{
|
|
82
|
-
|
|
179
|
+
success: true,
|
|
180
|
+
type: :text,
|
|
181
|
+
content: content,
|
|
182
|
+
metadata: {
|
|
183
|
+
size: content.size,
|
|
184
|
+
line_count: content.lines.count
|
|
185
|
+
}
|
|
83
186
|
}
|
|
84
|
-
|
|
187
|
+
rescue => e
|
|
85
188
|
{
|
|
86
|
-
success:
|
|
87
|
-
|
|
189
|
+
success: false,
|
|
190
|
+
error: "Failed to extract text: #{e.message}"
|
|
88
191
|
}
|
|
192
|
+
ensure
|
|
193
|
+
cleanup if @options[:auto_delete]
|
|
89
194
|
end
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
195
|
+
end
|
|
196
|
+
def cleanup
|
|
197
|
+
@temp_file.unlink if @temp_file
|
|
198
|
+
@temp_file = nil
|
|
94
199
|
end
|
|
95
200
|
end
|
|
96
201
|
end
|
|
97
|
-
end
|
|
202
|
+
end
|
|
203
|
+
end
|
data/lib/telegem.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: telegem
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.2.
|
|
4
|
+
version: 3.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- sick_phantom
|
|
@@ -13,72 +13,100 @@ dependencies:
|
|
|
13
13
|
name: httpx
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
|
-
- - "
|
|
16
|
+
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '0'
|
|
18
|
+
version: '1.0'
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
|
-
- - "
|
|
23
|
+
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '0'
|
|
25
|
+
version: '1.0'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: concurrent-ruby
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
|
-
- - "
|
|
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
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: securerandom
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
31
45
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '0'
|
|
46
|
+
version: '0.1'
|
|
33
47
|
type: :runtime
|
|
34
48
|
prerelease: false
|
|
35
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
50
|
requirements:
|
|
37
|
-
- - "
|
|
51
|
+
- - "~>"
|
|
38
52
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '0'
|
|
53
|
+
version: '0.1'
|
|
40
54
|
- !ruby/object:Gem::Dependency
|
|
41
55
|
name: async
|
|
42
56
|
requirement: !ruby/object:Gem::Requirement
|
|
43
57
|
requirements:
|
|
44
|
-
- - "
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.0'
|
|
61
|
+
type: :runtime
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: async-http
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
45
73
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '0'
|
|
74
|
+
version: '0.100'
|
|
47
75
|
type: :runtime
|
|
48
76
|
prerelease: false
|
|
49
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
78
|
requirements:
|
|
51
|
-
- - "
|
|
79
|
+
- - "~>"
|
|
52
80
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '0'
|
|
81
|
+
version: '0.100'
|
|
54
82
|
- !ruby/object:Gem::Dependency
|
|
55
83
|
name: pdf-reader
|
|
56
84
|
requirement: !ruby/object:Gem::Requirement
|
|
57
85
|
requirements:
|
|
58
|
-
- - "
|
|
86
|
+
- - "~>"
|
|
59
87
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '0'
|
|
88
|
+
version: '2.0'
|
|
61
89
|
type: :runtime
|
|
62
90
|
prerelease: false
|
|
63
91
|
version_requirements: !ruby/object:Gem::Requirement
|
|
64
92
|
requirements:
|
|
65
|
-
- - "
|
|
93
|
+
- - "~>"
|
|
66
94
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '0'
|
|
95
|
+
version: '2.0'
|
|
68
96
|
- !ruby/object:Gem::Dependency
|
|
69
97
|
name: docx
|
|
70
98
|
requirement: !ruby/object:Gem::Requirement
|
|
71
99
|
requirements:
|
|
72
|
-
- - "
|
|
100
|
+
- - "~>"
|
|
73
101
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0'
|
|
102
|
+
version: '0.3'
|
|
75
103
|
type: :runtime
|
|
76
104
|
prerelease: false
|
|
77
105
|
version_requirements: !ruby/object:Gem::Requirement
|
|
78
106
|
requirements:
|
|
79
|
-
- - "
|
|
107
|
+
- - "~>"
|
|
80
108
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: '0'
|
|
109
|
+
version: '0.3'
|
|
82
110
|
- !ruby/object:Gem::Dependency
|
|
83
111
|
name: rspec
|
|
84
112
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -145,6 +173,7 @@ files:
|
|
|
145
173
|
- lib/session/memory_store.rb
|
|
146
174
|
- lib/session/middleware.rb
|
|
147
175
|
- lib/session/scene_middleware.rb
|
|
176
|
+
- lib/telegem.code-workspace
|
|
148
177
|
- lib/telegem.rb
|
|
149
178
|
- lib/webhook/.gitkeep
|
|
150
179
|
- lib/webhook/server.rb
|
|
@@ -153,13 +182,13 @@ homepage: https://gitlab.com/ruby-telegem/telegem
|
|
|
153
182
|
licenses:
|
|
154
183
|
- MIT
|
|
155
184
|
metadata:
|
|
156
|
-
homepage_uri: https://gitlab.com/ruby-telegem/telegem
|
|
185
|
+
homepage_uri: https://gitlab.com/ruby-telegem/telegem/-/blob/main/README.md
|
|
157
186
|
source_code_uri: https://gitlab.com/ruby-telegem/telegem
|
|
158
187
|
changelog_uri: https://gitlab.com/ruby-telegem/telegem/-/blob/main/CHANGELOG.md
|
|
159
188
|
bug_tracker_uri: https://gitlab.com/ruby-telegem/telegem/-/issues
|
|
160
189
|
documentation_uri: https://gitlab.com/ruby-telegem/telegem/-/tree/main/docs-src?ref_type=heads
|
|
161
190
|
rubygems_mfa_required: 'false'
|
|
162
|
-
post_install_message: "Thanks for installing Telegem 3.2.
|
|
191
|
+
post_install_message: "Thanks for installing Telegem 3.2.2!\n\n\U0001F4DA Documentation:
|
|
163
192
|
https://gitlab.com/ruby-telegem/telegem\n\n\U0001F510 For SSL Webhooks:\nRun: telegem-ssl
|
|
164
193
|
your-domain.com\nThis sets up Let's Encrypt certificates automatically.\n\n\U0001F916
|
|
165
194
|
Happy bot building!\n"
|