Module: StoryTeller::Publisher
- Includes:
- Subscribers
- Included in:
- Inform::Ephemeral::Object, Inform::Event
- Defined in:
- lib/story_teller/publication.rb
Overview
The Publisher module to implement rudimentary pub-sub functionality
Constant Summary
Constants included from Subscribers
Instance Method Summary collapse
- #muted? ⇒ Boolean
- #publish(message, *args, &condition) ⇒ Object
- #publish_except(message, *args, &condition) ⇒ Object
-
#publish_only(message, *args, &condition) ⇒ Object
rubocop: enable Metrics/AbcSize rubocop: enable Metrics/CyclomaticComplexity rubocop: enable Metrics/PerceivedComplexity.
-
#publish_system_message(message, *args, &condition) ⇒ Object
For system messages (to the InformLibrary, mainly).
-
#subscribers ⇒ Object
rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/PerceivedComplexity.
Methods included from Subscribers
#explicit_subscribers, #subscribe, #unsubscribe, #unsubscribe_all
Instance Method Details
#muted? ⇒ Boolean
30 31 32 |
# File 'lib/story_teller/publication.rb', line 30 def muted? false end |
#publish(message, *args, &condition) ⇒ Object
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/story_teller/publication.rb', line 80 def publish(, *args, &condition) return (, *args, &condition) if .is_a?(Symbol) return if muted? subscribers.each do |subscriber| next if block_given? && !condition.call(subscriber) # log.info "#{subscriber.name}#update message: #{message.inspect}" subscriber.update(, *args) end false end |
#publish_except(message, *args, &condition) ⇒ Object
61 62 63 64 65 66 67 68 69 |
# File 'lib/story_teller/publication.rb', line 61 def publish_except(, *args, &condition) return if muted? (subscribers - args.flatten).each do |subscriber| next if block_given? && !condition.call(subscriber) log.warn "publishing message (#{}) to subscriber: #{subscriber}" subscriber.update() end false end |
#publish_only(message, *args, &condition) ⇒ Object
rubocop: enable Metrics/AbcSize rubocop: enable Metrics/CyclomaticComplexity rubocop: enable Metrics/PerceivedComplexity
52 53 54 55 56 57 58 59 |
# File 'lib/story_teller/publication.rb', line 52 def publish_only(, *args, &condition) return if muted? (subscribers & args.flatten).each do |subscriber| next if block_given? && !condition.call(subscriber) subscriber.update() end false end |
#publish_system_message(message, *args, &condition) ⇒ Object
For system messages (to the InformLibrary, mainly)
72 73 74 75 76 77 78 |
# File 'lib/story_teller/publication.rb', line 72 def (, *args, &condition) subscribers.each do |subscriber| next if block_given? && !condition.call(subscriber, *args) subscriber.send(, *args) if subscriber.respond_to?() end false end |
#subscribers ⇒ Object
rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/PerceivedComplexity
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/story_teller/publication.rb', line 37 def subscribers safe_refresh if respond_to?(:safe_refresh) root_obj = attempt_twice { root } if self.respond_to?(:root) # TODO: FIXME return explicit_subscribers.dup if root_obj.nil? eavesdroppers = (root_obj&.safe_refresh&.branch || []) - [self] # explicit_subscribers + (eavesdroppers & Session.players) # TODO: FIXME players = defined?(Session) ? Session.players.dup : [] explicit_subscribers + eavesdroppers.each_with_object([]) do |o1, memo| memo.concat(players.select { |o2| o1 == o2 }) end end |