From 4fdebc81786876ad6f7c5ce76d9dba7f8b4f82f5 Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Thu, 27 Jul 2023 14:55:00 +0100 Subject: [PATCH] Callbacks module extended Now supports callback methods as well observer classes levels example now uses callback methods register,deregister now alias add/remove observer methods minor version bump --- README.md | 23 ++++++++++++----------- examples/events/main.rb | 8 +++----- examples/levels/main.rb | 8 ++++++-- lib/obsws/event.rb | 15 +++++++++------ lib/obsws/version.rb | 4 ++-- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 89bd3ef..26fae94 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,10 @@ ### Bundler ``` -bundle add 'obsws' +bundle add obsws bundle install ``` -### Gem - -`gem install 'obsws'` - ## `Use` #### Example `main.rb` @@ -67,23 +63,28 @@ For a full list of requests refer to [Requests](https://github.com/obsproject/ob ### Events -Register an observer class and define `on_` methods for events. Method names should match the api event but snake cased. +Register `on_` callback methods. Method names should match the api event but snake cased. example: ```ruby class Observer def initialize - @e_client = OBSWS::Events::Client.new(**kwargs) - # register class with the event client - @e_client.add_observer(self) + @e_client = OBSWS::Events::Client.new(host: "localhost", port: 4455, password: "strongpassword") + # register callback methods with the Event client + @e_client.register( + [ + method(:on_current_program_scene_changed), + method(:on_input_mute_state_changed) + ] + ) end # define "on_" event methods. - def on_current_program_scene_changed + def on_current_program_scene_changed(data) ... end - def on_input_mute_state_changed + def on_input_mute_state_changed(data) ... end ... diff --git a/examples/events/main.rb b/examples/events/main.rb index ae64c9a..b423a49 100644 --- a/examples/events/main.rb +++ b/examples/events/main.rb @@ -21,11 +21,9 @@ class Main def infostring resp = @r_client.get_version [ - "Using obs version:", - resp.obs_version, - "With websocket version:", - resp.obs_web_socket_version - ].join("\n") + "Using obs version: #{resp.obs_version}.", + "With websocket version: #{resp.obs_web_socket_version}" + ].join(" ") end def on_current_program_scene_changed(data) diff --git a/examples/levels/main.rb b/examples/levels/main.rb index 7b6dd9c..9a896b8 100644 --- a/examples/levels/main.rb +++ b/examples/levels/main.rb @@ -1,7 +1,6 @@ require_relative "../../lib/obsws" require "yaml" - module LevelTypes VU = 0 POSTFADER = 1 @@ -14,7 +13,12 @@ class Main def initialize(**kwargs) subs = OBSWS::Events::SUBS::LOW_VOLUME | OBSWS::Events::SUBS::INPUTVOLUMEMETERS @e_client = OBSWS::Events::Client.new(subs:, **kwargs) - @e_client.add_observer(self) + @e_client.register( + [ + method(:on_input_mute_state_changed), + method(:on_input_volume_meters) + ] + ) end def run diff --git a/lib/obsws/event.rb b/lib/obsws/event.rb index 0525aa1..5bf9c59 100644 --- a/lib/obsws/event.rb +++ b/lib/obsws/event.rb @@ -43,7 +43,7 @@ module OBSWS def add_observer(observer) observer = [observer] if !observer.respond_to? :each - observer.each { |o| observers << o } + observer.each { |o| observers << o unless observers.include? o } end def remove_observer(observer) @@ -52,15 +52,18 @@ module OBSWS def notify_observers(event, data) observers.each do |o| - if o.respond_to? "on_#{snakecase(event)}" - if data.empty? - o.send("on_#{snakecase(event)}") - else - o.send("on_#{snakecase(event)}", data) + if o.is_a? Method + if o.name.to_s == "on_#{snakecase(event)}" + data.empty? ? o.call : o.call(data) end + elsif o.respond_to? "on_#{snakecase(event)}" + data.empty? ? o.send("on_#{snakecase(event)}") : o.send("on_#{snakecase(event)}", data) end end end + + alias_method :register, :add_observer + alias_method :deregister, :remove_observer end class Client diff --git a/lib/obsws/version.rb b/lib/obsws/version.rb index f350633..f18562b 100644 --- a/lib/obsws/version.rb +++ b/lib/obsws/version.rb @@ -7,11 +7,11 @@ module OBSWS end def minor - 3 + 4 end def patch - 3 + 0 end def to_a