Class: Cakewalk::Handler

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

Overview

Since:

  • 2.0.0

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bot, event, pattern, options = {}, &block) ⇒ Handler

Returns a new instance of Handler.

Parameters:

  • bot (Bot)
  • event (Symbol)
  • pattern (Pattern)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :group (Symbol) — default: nil

    Match group the h belongs to.

  • :execute_in_callback (Boolean) — default: false

    Whether to execute the handler in an instance of Callback

  • :strip_colors (Boolean) — default: false

    Strip colors from message before attemping match

  • :args (Array) — default: []

    Additional arguments to pass to the block

Since:

  • 2.0.0



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/cakewalk/handler.rb', line 41

def initialize(bot, event, pattern, options = {}, &block)
  options              = {
    :group => nil,
    :execute_in_callback => false,
    :strip_colors => false,
    :args => []
  }.merge(options)
  @bot                 = bot
  @event               = event
  @pattern             = pattern
  @group               = options[:group]
  @execute_in_callback = options[:execute_in_callback]
  @strip_colors        = options[:strip_colors]
  @args                = options[:args]
  @block               = block

  @thread_group = ThreadGroup.new
end

Instance Attribute Details

#argsArray (readonly)

Returns:

  • (Array)

Since:

  • 2.0.0



14
15
16
# File 'lib/cakewalk/handler.rb', line 14

def args
  @args
end

#blockProc (readonly)

Returns:

  • (Proc)

Since:

  • 2.0.0



17
18
19
# File 'lib/cakewalk/handler.rb', line 17

def block
  @block
end

#botBot (readonly)

Returns:

Since:

  • 2.0.0



5
6
7
# File 'lib/cakewalk/handler.rb', line 5

def bot
  @bot
end

#eventSymbol (readonly)

Returns:

  • (Symbol)

Since:

  • 2.0.0



8
9
10
# File 'lib/cakewalk/handler.rb', line 8

def event
  @event
end

#groupSymbol (readonly)

Returns:

  • (Symbol)

Since:

  • 2.0.0



20
21
22
# File 'lib/cakewalk/handler.rb', line 20

def group
  @group
end

#patternPattern (readonly)

Returns:

Since:

  • 2.0.0



11
12
13
# File 'lib/cakewalk/handler.rb', line 11

def pattern
  @pattern
end

#strip_colorsBoolean (readonly)

Returns:

  • (Boolean)

Since:

  • 2.0.0



23
24
25
# File 'lib/cakewalk/handler.rb', line 23

def strip_colors
  @strip_colors
end

#thread_groupThreadGroup (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (ThreadGroup)

Since:

  • 2.0.0



27
28
29
# File 'lib/cakewalk/handler.rb', line 27

def thread_group
  @thread_group
end

Instance Method Details

#call(message, captures, arguments) ⇒ Thread

Executes the handler.

Parameters:

  • message (Message)

    Message that caused the invocation

  • captures (Array)

    Capture groups of the pattern that are being passed as arguments

Returns:

  • (Thread)

Since:

  • 2.0.0



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/cakewalk/handler.rb', line 89

def call(message, captures, arguments)
  bargs = captures + arguments

  thread = Thread.new {
    @bot.loggers.debug "[New thread] For #{self}: #{Thread.current} -- #{@thread_group.list.size} in total."

    begin
      if @execute_in_callback
        @bot.callback.instance_exec(message, *@args, *bargs, &@block)
      else
        @block.call(message, *@args, *bargs)
      end
    rescue => e
      @bot.loggers.exception(e)
    ensure
      @bot.loggers.debug "[Thread done] For #{self}: #{Thread.current} -- #{@thread_group.list.size - 1} remaining."
    end
  }

  @thread_group.add(thread)
  thread
end

#stop

This method returns an undefined value.

Stops execution of the handler. This means stopping and killing all associated threads.

Since:

  • 2.0.0



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/cakewalk/handler.rb', line 71

def stop
  @bot.loggers.debug "[Stopping handler] Stopping all threads of handler #{self}: #{@thread_group.list.size} threads..."
  @thread_group.list.each do |thread|
    Thread.new do
      @bot.loggers.debug "[Ending thread] Waiting 10 seconds for #{thread} to finish..."
      thread.join(10)
      @bot.loggers.debug "[Killing thread] Killing #{thread}"
      thread.kill
    end
  end
end

#to_sString

Returns:

Since:

  • 2.0.0



113
114
115
116
# File 'lib/cakewalk/handler.rb', line 113

def to_s
  # TODO maybe add the number of running threads to the output?
  "#<Cakewalk::Handler @event=#{@event.inspect} pattern=#{@pattern.inspect}>"
end

#unregister

This method returns an undefined value.

Unregisters the handler.

Since:

  • 2.0.0



63
64
65
# File 'lib/cakewalk/handler.rb', line 63

def unregister
  @bot.handlers.unregister(self)
end