ezii-discord 0.test

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 16eff586b4ef4f772d1c6626b7fdd51a70fb4582922b0b87c1289819a2ea99d1
4
+ data.tar.gz: eed8da7949bedf39add6d15153a7e4c7dd3184807cfaae84248f3a8cae6ae420
5
+ SHA512:
6
+ metadata.gz: dd2b89bd23c6d60e77efce60c9c14d8eff7ca58b5e7fd54a2d83cb22be7cc5096bc4eb62ce8343e917d34598c16abbab0f971353631c29b9b71f27f36f9d95d6
7
+ data.tar.gz: 9659f623af82656d3efd416a1acf2ea541892022783f30a158543832a93aac2bcdf1f27839af5c22eebc6f726d7bd074cf1be6bc71027e9f4e60bb8e49040dad
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+
2
+ gem 'ladder', '11.test', git: 'https://github.com/eZii-jester-data/ladder-gem.git'
3
+ gem 'discordrb'
4
+ gem 'byebug'
@@ -0,0 +1,56 @@
1
+ GIT
2
+ remote: https://github.com/eZii-jester-data/ladder-gem.git
3
+ revision: f387e0fd49f1a0dffea5488afc0366bba1c8b713
4
+ specs:
5
+ ladder (11.test)
6
+
7
+ GEM
8
+ specs:
9
+ byebug (11.0.1)
10
+ discordrb (3.3.0)
11
+ discordrb-webhooks (~> 3.3.0)
12
+ ffi (>= 1.9.24)
13
+ opus-ruby
14
+ rbnacl (~> 3.4.0)
15
+ rest-client (>= 2.1.0.rc1)
16
+ websocket-client-simple (>= 0.3.0)
17
+ discordrb-webhooks (3.3.0)
18
+ rest-client (>= 2.1.0.rc1)
19
+ domain_name (0.5.20190701)
20
+ unf (>= 0.0.5, < 1.0.0)
21
+ event_emitter (0.2.6)
22
+ ffi (1.11.1)
23
+ http-accept (1.7.0)
24
+ http-cookie (1.0.3)
25
+ domain_name (~> 0.5)
26
+ mime-types (3.3)
27
+ mime-types-data (~> 3.2015)
28
+ mime-types-data (3.2019.0904)
29
+ netrc (0.11.0)
30
+ opus-ruby (1.0.1)
31
+ ffi
32
+ rbnacl (3.4.0)
33
+ ffi
34
+ rest-client (2.1.0.rc1)
35
+ http-accept (>= 1.7.0, < 2.0)
36
+ http-cookie (>= 1.0.2, < 2.0)
37
+ mime-types (>= 1.16, < 4.0)
38
+ netrc (~> 0.8)
39
+ unf (0.1.4)
40
+ unf_ext
41
+ unf_ext (0.0.7.6)
42
+ websocket (1.2.8)
43
+ websocket-client-simple (0.3.0)
44
+ event_emitter
45
+ websocket
46
+
47
+ PLATFORMS
48
+ ruby
49
+
50
+ DEPENDENCIES
51
+ byebug
52
+ discordrb
53
+ ladder (= 11.test)!
54
+
55
+ BUNDLED WITH
56
+ 1.17.2
@@ -0,0 +1,2 @@
1
+ 1. run bundle install
2
+ 2. run bundle exec ruby chat-bot-1.rb
@@ -0,0 +1,701 @@
1
+ require 'ladder'
2
+ require 'discordrb'
3
+
4
+ class FalseClass
5
+ def false?
6
+ self == false
7
+ end
8
+ end
9
+ class TrueClass
10
+ def false?
11
+ self == false
12
+ end
13
+ end
14
+
15
+
16
+ class GBotResponseNotCapture < Exception
17
+ end
18
+
19
+ module EZIIDiscordIntegration
20
+
21
+ TEST_COMMAND_STRING = "5 results for te123§§st"
22
+ MESSAGE = "gbot: #{TEST_COMMAND_STRING} | filter by curl response time | top 1"
23
+
24
+
25
+ VIRTUAL_EXCEPTION = {}
26
+
27
+
28
+
29
+ USER_ID_HOLDER = {gbot_id: nil}
30
+ FIRST_GBOT_MESSAGE_HOLDER = {first_gbot_message_id: nil}
31
+
32
+
33
+ ERR_ID_0 = "search string for gbot is not a string"# ,
34
+ ERR_ID_1 = "respoonse not delivered within 1 second"# ,
35
+ ERR_ID_2 = "Gbot discord user id was not configured, start the assignment after bot restart by '!pipeline gbot-id-capture"# ,
36
+ ERR_ID_3 = "Gbot didn't respond within timeframe"# ,
37
+ ERR_ID_4 = "Gbot answered more than once within timeframe (this bot must run in a channel where only this bot is allowed to write messages to gbot)"# ,
38
+ ERR_ID_5 = "ID of all following gbot messages must not equal the id of the first gbot message"
39
+ ERR_ID_6 = "ID of first gbot message received by this program must not be nil"
40
+ ERR_ID_7 = "DISCORD_MESSAGES must be synced globally"
41
+ ERR_ID_8 = "Curl not working dum dum"
42
+
43
+
44
+
45
+ def self.monkeypatching
46
+ yield
47
+ end
48
+
49
+ monkeypatching do
50
+ module Discordrb
51
+ # Represents a Discord bot, including servers, users, etc.
52
+ class Bot
53
+
54
+ def handle_dispatch(type, data)
55
+ # Check whether there are still unavailable servers and there have been more than 10 seconds since READY
56
+ if @unavailable_servers && @unavailable_servers > 0 && (Time.now - @unavailable_timeout_time) > 10
57
+ # The server streaming timed out!
58
+ LOGGER.debug("Server streaming timed out with #{@unavailable_servers} servers remaining")
59
+ LOGGER.debug('Calling ready now because server loading is taking a long time. Servers may be unavailable due to an outage, or your bot is on very large servers.')
60
+
61
+ # Unset the unavailable server count so this doesn't get triggered again
62
+ @unavailable_servers = 0
63
+
64
+ notify_ready
65
+ end
66
+
67
+ case type
68
+ when :READY
69
+ # As READY may be called multiple times over a single process lifetime, we here need to reset the cache entirely
70
+ # to prevent possible inconsistencies, like objects referencing old versions of other objects which have been
71
+ # replaced.
72
+ init_cache
73
+
74
+ @profile = Profile.new(data['user'], self)
75
+
76
+ # Initialize servers
77
+ @servers = {}
78
+
79
+ # Count unavailable servers
80
+ @unavailable_servers = 0
81
+
82
+ data['guilds'].each do |element|
83
+ # Check for true specifically because unavailable=false indicates that a previously unavailable server has
84
+ # come online
85
+ if element['unavailable'].is_a? TrueClass
86
+ @unavailable_servers += 1
87
+
88
+ # Ignore any unavailable servers
89
+ next
90
+ end
91
+
92
+ ensure_server(element)
93
+ end
94
+
95
+ # Add PM and group channels
96
+ data['private_channels'].each do |element|
97
+ channel = ensure_channel(element)
98
+ if channel.pm?
99
+ @pm_channels[channel.recipient.id] = channel
100
+ else
101
+ @channels[channel.id] = channel
102
+ end
103
+ end
104
+
105
+ # Don't notify yet if there are unavailable servers because they need to get available before the bot truly has
106
+ # all the data
107
+ if @unavailable_servers.zero?
108
+ # No unavailable servers - we're ready!
109
+ notify_ready
110
+ end
111
+
112
+ @ready_time = Time.now
113
+ @unavailable_timeout_time = Time.now
114
+ when :GUILD_MEMBERS_CHUNK
115
+ id = data['guild_id'].to_i
116
+ server = server(id)
117
+ server.process_chunk(data['members'])
118
+ when :MESSAGE_CREATE
119
+
120
+ ladder(data)
121
+
122
+
123
+ if ignored?(data['author']['id'].to_i)
124
+ debug("Ignored author with ID #{data['author']['id']}")
125
+ return
126
+ end
127
+
128
+ if @ignore_bots && data['author']['bot']
129
+ debug("Ignored Bot account with ID #{data['author']['id']}")
130
+ return
131
+ end
132
+
133
+ # If create_message is overwritten with a method that returns the parsed message, use that instead, so we don't
134
+ # parse the message twice (which is just thrown away performance)
135
+ message = create_message(data)
136
+ message = Message.new(data, self) unless message.is_a? Message
137
+
138
+ return if message.from_bot? && !should_parse_self
139
+
140
+ event = MessageEvent.new(message, self)
141
+ raise_event(event)
142
+
143
+ if message.mentions.any? { |user| user.id == @profile.id }
144
+ event = MentionEvent.new(message, self)
145
+ raise_event(event)
146
+ end
147
+
148
+ if message.channel.private?
149
+ event = PrivateMessageEvent.new(message, self)
150
+ raise_event(event)
151
+ end
152
+ when :MESSAGE_UPDATE
153
+ update_message(data)
154
+
155
+ message = Message.new(data, self)
156
+ return if message.from_bot? && !should_parse_self
157
+
158
+ unless message.author
159
+ LOGGER.debug("Edited a message with nil author! Content: #{message.content.inspect}, channel: #{message.channel.inspect}")
160
+ return
161
+ end
162
+
163
+ event = MessageEditEvent.new(message, self)
164
+ raise_event(event)
165
+ when :MESSAGE_DELETE
166
+ delete_message(data)
167
+
168
+ event = MessageDeleteEvent.new(data, self)
169
+ raise_event(event)
170
+ when :MESSAGE_DELETE_BULK
171
+ debug("MESSAGE_DELETE_BULK will raise #{data['ids'].length} events")
172
+
173
+ data['ids'].each do |single_id|
174
+ # Form a data hash for a single ID so the methods get what they want
175
+ single_data = {
176
+ 'id' => single_id,
177
+ 'channel_id' => data['channel_id']
178
+ }
179
+
180
+ # Raise as normal
181
+ delete_message(single_data)
182
+
183
+ event = MessageDeleteEvent.new(single_data, self)
184
+ raise_event(event)
185
+ end
186
+ when :TYPING_START
187
+ start_typing(data)
188
+
189
+ begin
190
+ event = TypingEvent.new(data, self)
191
+ raise_event(event)
192
+ rescue Discordrb::Errors::NoPermission
193
+ debug 'Typing started in channel the bot has no access to, ignoring'
194
+ end
195
+ when :MESSAGE_REACTION_ADD
196
+ add_message_reaction(data)
197
+
198
+ return if profile.id == data['user_id'].to_i && !should_parse_self
199
+
200
+ event = ReactionAddEvent.new(data, self)
201
+ raise_event(event)
202
+ when :MESSAGE_REACTION_REMOVE
203
+ remove_message_reaction(data)
204
+
205
+ return if profile.id == data['user_id'].to_i && !should_parse_self
206
+
207
+ event = ReactionRemoveEvent.new(data, self)
208
+ raise_event(event)
209
+ when :MESSAGE_REACTION_REMOVE_ALL
210
+ remove_all_message_reactions(data)
211
+
212
+ event = ReactionRemoveAllEvent.new(data, self)
213
+ raise_event(event)
214
+ when :PRESENCE_UPDATE
215
+ # Ignore friends list presences
216
+ return unless data['guild_id']
217
+
218
+ now_playing = data['game'].nil? ? nil : data['game']['name']
219
+ presence_user = @users[data['user']['id'].to_i]
220
+ played_before = presence_user.nil? ? nil : presence_user.game
221
+ update_presence(data)
222
+
223
+ event = if now_playing != played_before
224
+ PlayingEvent.new(data, self)
225
+ else
226
+ PresenceEvent.new(data, self)
227
+ end
228
+
229
+ raise_event(event)
230
+ when :VOICE_STATE_UPDATE
231
+ old_channel_id = update_voice_state(data)
232
+
233
+ event = VoiceStateUpdateEvent.new(data, old_channel_id, self)
234
+ raise_event(event)
235
+ when :VOICE_SERVER_UPDATE
236
+ update_voice_server(data)
237
+
238
+ # no event as this is irrelevant to users
239
+ when :CHANNEL_CREATE
240
+ create_channel(data)
241
+
242
+ event = ChannelCreateEvent.new(data, self)
243
+ raise_event(event)
244
+ when :CHANNEL_UPDATE
245
+ update_channel(data)
246
+
247
+ event = ChannelUpdateEvent.new(data, self)
248
+ raise_event(event)
249
+ when :CHANNEL_DELETE
250
+ delete_channel(data)
251
+
252
+ event = ChannelDeleteEvent.new(data, self)
253
+ raise_event(event)
254
+ when :CHANNEL_RECIPIENT_ADD
255
+ add_recipient(data)
256
+
257
+ event = ChannelRecipientAddEvent.new(data, self)
258
+ raise_event(event)
259
+ when :CHANNEL_RECIPIENT_REMOVE
260
+ remove_recipient(data)
261
+
262
+ event = ChannelRecipientRemoveEvent.new(data, self)
263
+ raise_event(event)
264
+ when :GUILD_MEMBER_ADD
265
+ add_guild_member(data)
266
+
267
+ event = ServerMemberAddEvent.new(data, self)
268
+ raise_event(event)
269
+ when :GUILD_MEMBER_UPDATE
270
+ update_guild_member(data)
271
+
272
+ event = ServerMemberUpdateEvent.new(data, self)
273
+ raise_event(event)
274
+ when :GUILD_MEMBER_REMOVE
275
+ delete_guild_member(data)
276
+
277
+ event = ServerMemberDeleteEvent.new(data, self)
278
+ raise_event(event)
279
+ when :GUILD_BAN_ADD
280
+ add_user_ban(data)
281
+
282
+ event = UserBanEvent.new(data, self)
283
+ raise_event(event)
284
+ when :GUILD_BAN_REMOVE
285
+ remove_user_ban(data)
286
+
287
+ event = UserUnbanEvent.new(data, self)
288
+ raise_event(event)
289
+ when :GUILD_ROLE_UPDATE
290
+ update_guild_role(data)
291
+
292
+ event = ServerRoleUpdateEvent.new(data, self)
293
+ raise_event(event)
294
+ when :GUILD_ROLE_CREATE
295
+ create_guild_role(data)
296
+
297
+ event = ServerRoleCreateEvent.new(data, self)
298
+ raise_event(event)
299
+ when :GUILD_ROLE_DELETE
300
+ delete_guild_role(data)
301
+
302
+ event = ServerRoleDeleteEvent.new(data, self)
303
+ raise_event(event)
304
+ when :GUILD_CREATE
305
+ create_guild(data)
306
+
307
+ # Check for false specifically (no data means the server has never been unavailable)
308
+ if data['unavailable'].is_a? FalseClass
309
+ @unavailable_servers -= 1 if @unavailable_servers
310
+ @unavailable_timeout_time = Time.now
311
+
312
+ notify_ready if @unavailable_servers.zero?
313
+
314
+ # Return here so the event doesn't get triggered
315
+ return
316
+ end
317
+
318
+ event = ServerCreateEvent.new(data, self)
319
+ raise_event(event)
320
+ when :GUILD_UPDATE
321
+ update_guild(data)
322
+
323
+ event = ServerUpdateEvent.new(data, self)
324
+ raise_event(event)
325
+ when :GUILD_DELETE
326
+ delete_guild(data)
327
+
328
+ if data['unavailable'].is_a? TrueClass
329
+ LOGGER.warn("Server #{data['id']} is unavailable due to an outage!")
330
+ return # Don't raise an event
331
+ end
332
+
333
+ event = ServerDeleteEvent.new(data, self)
334
+ raise_event(event)
335
+ when :GUILD_EMOJIS_UPDATE
336
+ server_id = data['guild_id'].to_i
337
+ server = @servers[server_id]
338
+ old_emoji_data = server.emoji.clone
339
+ update_guild_emoji(data)
340
+ new_emoji_data = server.emoji
341
+
342
+ created_ids = new_emoji_data.keys - old_emoji_data.keys
343
+ deleted_ids = old_emoji_data.keys - new_emoji_data.keys
344
+ updated_ids = old_emoji_data.select do |k, v|
345
+ new_emoji_data[k] && (v.name != new_emoji_data[k].name || v.roles != new_emoji_data[k].roles)
346
+ end.keys
347
+
348
+ event = ServerEmojiChangeEvent.new(server, data, self)
349
+ raise_event(event)
350
+
351
+ created_ids.each do |e|
352
+ event = ServerEmojiCreateEvent.new(server, new_emoji_data[e], self)
353
+ raise_event(event)
354
+ end
355
+
356
+ deleted_ids.each do |e|
357
+ event = ServerEmojiDeleteEvent.new(server, old_emoji_data[e], self)
358
+ raise_event(event)
359
+ end
360
+
361
+ updated_ids.each do |e|
362
+ event = ServerEmojiUpdateEvent.new(server, old_emoji_data[e], new_emoji_data[e], self)
363
+ raise_event(event)
364
+ end
365
+ when :WEBHOOKS_UPDATE
366
+ event = WebhookUpdateEvent.new(data, self)
367
+ raise_event(event)
368
+ else
369
+ # another event that we don't support yet
370
+ debug "Event #{type} has been received but is unsupported. Raising UnknownEvent"
371
+
372
+ event = UnknownEvent.new(type, data, self)
373
+ raise_event(event)
374
+ end
375
+
376
+ # The existence of this array is checked before for performance reasons, since this has to be done for *every*
377
+ # dispatch.
378
+ if @event_handlers && @event_handlers[RawEvent]
379
+ event = RawEvent.new(type, data, self)
380
+ raise_event(event)
381
+ end
382
+ rescue Exception => e
383
+ LOGGER.error('Gateway message error!')
384
+ log_exception(e)
385
+ end
386
+ end
387
+ end
388
+ end
389
+
390
+
391
+ def self.split_into_pipe_parts(message: '', pipe_unicode_symbol: '|')
392
+ message.split('|')
393
+ end
394
+
395
+
396
+
397
+ class PipelineDiscordBot
398
+ CURL_RESPONSES_HOLDER = {}
399
+
400
+ attr_reader :bot
401
+
402
+
403
+ def initialize
404
+ @bot = ::Discordrb::Bot.new token: ENV['BOT_TOKEN']
405
+
406
+ self.add_pipeline_command
407
+ self.add_gbot_id_fetch_command
408
+ end
409
+
410
+ def get_gbot_message(query, event, callback)
411
+ command = GbotCommandForBot2Bot.new(query, event)
412
+ capture = GbotCommandResponseCapture.new(command)
413
+
414
+ capture.command.send do
415
+ capture.pump_once do
416
+ if !capture.response.nil? && extract_urls_from_gbot_response(capture.response).any?
417
+ callback.call(capture.response)
418
+ end
419
+ end
420
+ end
421
+ end
422
+
423
+ def use(*args)
424
+ yield
425
+ end
426
+
427
+ def where_the_use_would_fail(*args)
428
+ yield
429
+ end
430
+
431
+ def §(*args)
432
+ yield if block_given?
433
+ end
434
+
435
+ ESSENTIAL_DECLARATINO_OF_LOCAL_VARIABLE = [self, 0]
436
+
437
+ def add_pipeline_command
438
+ bot.message(with_text: 'pipeline:') do |event|
439
+
440
+ if USER_ID_HOLDER[:gbot_id].nil?
441
+ event.respond("Please first initialize via !pipeline gbot-id-capture")
442
+
443
+ else
444
+
445
+ event.user.await(:pipeline_definition) do |pipeline_definition_message_event|
446
+
447
+
448
+ user_message = pipeline_definition_message_event.message.content
449
+
450
+ pipe_parts = EZIIDiscordIntegration.split_into_pipe_parts(message: MESSAGE.gsub('te123§§st', user_message), pipe_unicode_symbol: '|')
451
+
452
+ event.respond pipe_parts.inspect
453
+
454
+ pipeline = Pipeline.new
455
+ pipe_parts.each do |pipe_part| pipeline.add(pipe_part) end
456
+
457
+
458
+
459
+ pipeline.run { |message, left_commands_count, new_output_value_callback, last_output_value_callback|
460
+
461
+
462
+
463
+ event.respond("Commands to be run after this one: #{left_commands_count}, now running:")
464
+
465
+ thread = lambda { |est| est.call }
466
+ if message =~ /gbot/
467
+ get_gbot_message(
468
+ message.gsub('gbot:', ''),
469
+ event,
470
+ ->(response_message) do
471
+ new_output_value_callback.call(response_message)
472
+ end)
473
+
474
+
475
+ end
476
+
477
+
478
+ if message =~ /curl/
479
+ CURL_RESPONSES_HOLDER[0] = lambda do |&block|
480
+ last_output_value_callback.call do |value|
481
+ block.call(prepare_curl_responses(value))
482
+ end
483
+ end
484
+ end
485
+
486
+
487
+ if message =~ /top/
488
+ CURL_RESPONSES_HOLDER[0].call do |value|
489
+ event.respond(value.wait_for_finish.winner)
490
+ end
491
+ end
492
+
493
+ }
494
+ end
495
+
496
+ end
497
+ end
498
+ end
499
+
500
+ require_relative './lib/ezii_curl_manager.rb'
501
+ def prepare_curl_responses(gbot_message)
502
+ cm = CurlManager.new( extract_urls_from_gbot_response( gbot_message ) )
503
+
504
+ cm.start_calls_in_background
505
+
506
+
507
+ return cm
508
+ end
509
+
510
+
511
+ def extract_urls_from_gbot_response(gbot_message)
512
+ return gbot_message.scan(/<([^>]*)>/)
513
+ end
514
+
515
+
516
+ def add_gbot_id_fetch_command
517
+ bot.message(content: '!pipeline gbot-id-capture') do |event|
518
+ event.respond("Type start to begin")
519
+ event.user.await(:start) do |start_event|
520
+ event.respond('gbot: get-id')
521
+
522
+ ladder { |data|
523
+ if(data['author']['username'] == 'GBot')
524
+ USER_ID_HOLDER[:gbot_id] ||= data['author']['id']
525
+ FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id] ||= data['id']
526
+
527
+ event.respond('Google Bot Discord ID is ' + USER_ID_HOLDER[:gbot_id].inspect)
528
+ end
529
+ }
530
+ end
531
+ end
532
+ end
533
+ end
534
+
535
+
536
+ class Pipeline
537
+ attr_accessor :block
538
+ def initialize
539
+ @queue = []
540
+ end
541
+
542
+ def add(execute)
543
+ # §(USE_PUSH_OVER_UNSHIFT_FOR: QUEUE_IMPLEEMENTATION)
544
+ @queue.push(execute)
545
+ # end
546
+ end
547
+
548
+ def run
549
+ last_item = nil
550
+ while @queue.any?
551
+ last_item = yield(@queue.shift, @queue.size, new_output_value_callback, last_output_value_callback)
552
+ end
553
+ end
554
+
555
+
556
+ def new_output_value_callback
557
+ return Proc.new do |new_value|
558
+ self.block.call(new_value)
559
+ end
560
+ end
561
+
562
+ def last_output_value_callback
563
+ return Proc.new do |&block|
564
+ self.block = block
565
+ end
566
+ end
567
+
568
+ def inspect
569
+ """
570
+ First run command #{@queue[0]}
571
+ Second run command #{@queue[1]}
572
+ Third run command #{@queue[2]}
573
+ """
574
+ end
575
+ end
576
+
577
+ module Pipeline::ExpectResponseWithin
578
+ module ClassMethods
579
+ def timeframe_for_response=(timeframe_in_seconds)
580
+ @timeframe_in_seconds = timeframe_in_seconds
581
+ end
582
+
583
+ def timeframe_for_response
584
+ @timeframe_in_seconds
585
+ end
586
+ end
587
+ end
588
+
589
+
590
+
591
+ class GbotCommandResponseCapture
592
+ attr_accessor :command
593
+ def initialize(command)
594
+ @command = command
595
+ end
596
+
597
+ extend Pipeline::ExpectResponseWithin::ClassMethods
598
+
599
+ @user_id_of_message_to_be_captured = USER_ID_HOLDER
600
+ self.timeframe_for_response = 200 # Second
601
+
602
+
603
+ def ALL_FALSE(*args)
604
+ args.all?(&:false?)
605
+ end
606
+
607
+ def ALL_FALSE_INSPECT(*args)
608
+ args.each_slice(2).map { |boolean, explanation|
609
+ "#{explanation}: #{boolean}"
610
+ }.join(' <> ')
611
+ end
612
+
613
+
614
+ def pump_once(&block)
615
+ count = 0
616
+ self.pump do
617
+ @stop_ladder = true if count > 0
618
+
619
+
620
+ if @stop_ladder
621
+ ladder(stop: @ladder_1)
622
+ else
623
+ block.call
624
+ count += 1
625
+ end
626
+ end
627
+ end
628
+
629
+ def pump(&block)
630
+ fail ERR_ID_2 if self.class.instance_variable_get(:@user_id_of_message_to_be_captured)[:gbot_id].nil?
631
+
632
+
633
+ gbot_id = self.class.instance_variable_get(:@user_id_of_message_to_be_captured)[:gbot_id]
634
+
635
+ message = nil
636
+ messages_by_gbot_in_timeframe = 0
637
+ @ladder_1 = ladder do |message_data|
638
+
639
+ puts message_data.inspect
640
+
641
+ puts ALL_FALSE_INSPECT(
642
+ message_data.nil?, "message_data.nil?",
643
+ FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id].nil?, "FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id].nil?",
644
+ message_data['id'] == FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id], "message_data['id'] == FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id]"
645
+ )
646
+
647
+
648
+ if ALL_FALSE(message_data.nil?, FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id].nil?, message_data['id'] == FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id])
649
+ fail ERR_ID_7 if message_data.nil?
650
+ fail ERR_ID_6 if FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id].nil?
651
+ fail ERR_ID_5 if message_data['id'] == FIRST_GBOT_MESSAGE_HOLDER[:first_gbot_message_id] # or fail ERR_ID_5
652
+
653
+ if message_data['author']['id'] == gbot_id
654
+ messages_by_gbot_in_timeframe += 1
655
+
656
+ message = message_data['content']
657
+ end
658
+
659
+
660
+ fail ERR_ID_3 if message.nil?
661
+ # next if message.nil?
662
+ fail ERR_ID_4 if messages_by_gbot_in_timeframe > 1
663
+
664
+ @message = message
665
+
666
+ puts "TEST TEST"
667
+
668
+ block.call
669
+ end
670
+ end
671
+ end
672
+
673
+ def response
674
+ @message
675
+ end
676
+ end
677
+
678
+ class GbotCommandForBot2Bot
679
+ def initialize(text, event)
680
+ @text = text
681
+ @event = event
682
+ end
683
+
684
+ def to_discord_message
685
+ "gbot: #{@text.to_s}"
686
+ end
687
+
688
+ def send
689
+ @event.respond(self.to_discord_message)
690
+
691
+
692
+ yield
693
+ end
694
+ end
695
+ end
696
+
697
+
698
+
699
+ ladder {}
700
+
701
+ EZIIDiscordIntegration::PipelineDiscordBot.new.bot.run
@@ -0,0 +1,14 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'ezii-discord'
3
+ s.version = '0.test'
4
+ s.date = '2019-10-23'
5
+ s.summary = "eZii Discord Integration RB"
6
+ s.description = "integrate eZii as a discord bot easily"
7
+ s.authors = ["Manuel Arno Korfmann"]
8
+ s.email = 'manu@korfmann.info'
9
+ s.files = Dir.glob("**/*")
10
+ s.homepage =
11
+ 'https://google.com/?q=eZii'
12
+ s.license = 'MIT'
13
+ end
14
+
@@ -0,0 +1,58 @@
1
+ module EZIIDiscordIntegration
2
+ class CurlManager
3
+ def initialize(website_urls)
4
+ @website_urls = website_urls.flatten
5
+ @threads = {}
6
+ end
7
+
8
+ def start_calls_in_background
9
+ @website_urls.each do |url|
10
+ # tst = -> { `curl #{CGI.escape(url)} -s -o /dev/null -w "%{time_starttransfer}\n"` }
11
+ #
12
+ # byebug
13
+ #
14
+ #
15
+
16
+ thread = Thread.new do
17
+ # §(INSECURE)
18
+
19
+ @threads[thread] = [`curl '#{url}' -s -o /dev/null -w "%{time_starttransfer}\n"`, url]
20
+ end
21
+
22
+ @threads[thread] = nil
23
+ end
24
+ end
25
+
26
+ def wait_for_finish
27
+ @threads.keys.each(&:join)
28
+
29
+ return self
30
+ end
31
+
32
+ def winner
33
+ return @threads.values.min_by do |value|
34
+ fail ERR_ID_8 if !(value[0].to_f > 0)
35
+ value[0].to_f
36
+ end.inspect
37
+ end
38
+
39
+ def inspect
40
+ """
41
+ EZIIDiscordIntegration::CurlManagers
42
+ Binding: #{binding}
43
+ File: #{__FILE__}
44
+
45
+
46
+ inspect of EZIIDiscordIntegration::CurlManagers# -> @website_urls (# is the symbol for an instance -> method edge in ruby)
47
+
48
+
49
+ #{@website_urls.inspect}
50
+
51
+
52
+ Threads
53
+
54
+ #{@threads.inspect}
55
+ """
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../ezii_curl_manager.rb'
2
+
3
+
4
+ cm = EZIIDiscordIntegration::CurlManager.new("teest")
5
+
6
+
7
+ fail if cm.nil?
@@ -0,0 +1,10 @@
1
+ # @bot = ::Discordrb::Bot.new token: ENV['TEST_BOT_TOKEN']
2
+
3
+
4
+ # bot.message(with_text: 'pipeline:') do |event| # message must only cntain the text
5
+ #
6
+ #
7
+ # bot.message(content: '!pipeline gbot-id-capture') do |event| # message content must exactly match the content: value
8
+ # event.respond("Type start to begin")
9
+ # event.user.await(:start) do |start_event| # awaits any input by the user (or any user?)
10
+ # event.respond('gbot: get-id')
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ezii-discord
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.test
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Arno Korfmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-23 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: integrate eZii as a discord bot easily
14
+ email: manu@korfmann.info
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - Gemfile
20
+ - Gemfile.lock
21
+ - TUTORIAL.md
22
+ - chat-bot-1.rb
23
+ - ezii-discord-integration.gemspec
24
+ - lib/ezii_curl_manager.rb
25
+ - lib/test/test_ezii_curl_manager.rb
26
+ - test/test-chat-bot-1.rb
27
+ homepage: https://google.com/?q=eZii
28
+ licenses:
29
+ - MIT
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">"
43
+ - !ruby/object:Gem::Version
44
+ version: 1.3.1
45
+ requirements: []
46
+ rubygems_version: 3.0.3
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: eZii Discord Integration RB
50
+ test_files: []