syndi 0.1.0 → 0.1.1
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/README.md +8 -8
- data/Rakefile +6 -2
- data/WINDOWS.md +2 -2
- data/bin/syndi +1 -1
- data/bin/syndi-conf +1 -1
- data/ext/csyndi/libauto.c +1 -1
- data/ext/csyndi/logger.c +3 -2
- data/include/syndi/csyndi.h +3 -3
- data/include/syndi/logger.h +1 -2
- data/include/syndi.h +2 -2
- data/lib/csyndi.so +0 -0
- data/lib/syndi/bot.rb +1 -5
- data/lib/syndi/config.rb +1 -1
- data/lib/syndi/events.rb +27 -11
- data/lib/syndi/irc/protocol.rb +1 -4
- data/lib/syndi/irc/sasl/mech/dh_blowfish.rb +1 -1
- data/lib/syndi/irc/sasl/mech.rb +2 -10
- data/lib/syndi/version.rb +1 -1
- data/lib/syndi.rb +9 -1
- data/spec/helper.rb +9 -4
- data/spec/syndi/events_spec.rb +55 -9
- data/tasks/compile.rake +1 -1
- metadata +3 -8
- data/INSTALL.md +0 -86
- data/lib/syndi/api/events.rb +0 -170
- data/lib/syndi/api/plugin.rb +0 -155
- data/lib/syndi/configure/cli.rb +0 -23
- data/lib/syndi/configure/generator.rb +0 -410
- data/lib/syndi/configure.rb +0 -19
data/lib/syndi/api/events.rb
DELETED
@@ -1,170 +0,0 @@
|
|
1
|
-
# Copyright (c) 2013, Autumn Perrault, et al. All rights reserved.
|
2
|
-
# This free software is distributed under the FreeBSD license (see LICENSE).
|
3
|
-
|
4
|
-
require 'thread'
|
5
|
-
require 'syndi/verbosity'
|
6
|
-
require 'syndi/api/object'
|
7
|
-
|
8
|
-
# Entering namespace: Syndi
|
9
|
-
module Syndi
|
10
|
-
|
11
|
-
# Entering namespace: API
|
12
|
-
module API
|
13
|
-
|
14
|
-
# A class which provides the the fundamental event system, upon which
|
15
|
-
# much of the API is based, and which follows a simple model of broadcasting
|
16
|
-
# and hooking onto such broadcasts.
|
17
|
-
#
|
18
|
-
# Plugin writers may be rather interested in {Syndi::DSL::Base}, since that
|
19
|
-
# provides a simpler interface to Syndi's instances of this class.
|
20
|
-
#
|
21
|
-
# @api Syndi
|
22
|
-
# @since 4.0.0
|
23
|
-
# @author noxgirl
|
24
|
-
#
|
25
|
-
# @see Syndi::DSL::Base
|
26
|
-
#
|
27
|
-
# @!attribute [r] threads
|
28
|
-
# @return [Array] An array of threads used by {#call}.
|
29
|
-
class Events < Syndi::API::Object
|
30
|
-
|
31
|
-
attr_reader :events, :threads
|
32
|
-
|
33
|
-
# Create a new instance of Syndi::API::Events.
|
34
|
-
def initialize
|
35
|
-
@events = {}
|
36
|
-
@threads = []
|
37
|
-
end
|
38
|
-
|
39
|
-
# Listen for (hook onto) an event.
|
40
|
-
#
|
41
|
-
# @param [Symbol] event The name of the event for which to listen.
|
42
|
-
# @param [Integer] priority The priority of the event from 1-5, 1 being utmost priority.
|
43
|
-
#
|
44
|
-
# @yield [...] The arguments that will be yielded to the block vary by event.
|
45
|
-
# Please consult with the {file:docs/Events.md events specification} for details by event.
|
46
|
-
#
|
47
|
-
# @return [Array(Symbol, Integer, String)] Identification data including a unique string. Keep
|
48
|
-
# this if you need to destroy the hook later.
|
49
|
-
#
|
50
|
-
# @example
|
51
|
-
# events.on :disconnect do |irc|
|
52
|
-
# puts "I'm dying!"
|
53
|
-
# end
|
54
|
-
#
|
55
|
-
# @see Syndi::DSL::Base#on
|
56
|
-
# @see file:docs/Events.md
|
57
|
-
def on(event, priority=3, &cb)
|
58
|
-
|
59
|
-
# Priority must be in the range of 1-5.
|
60
|
-
unless (1..5).include? priority
|
61
|
-
return 0
|
62
|
-
end
|
63
|
-
|
64
|
-
# If the event does not exist, create it.
|
65
|
-
@events[event] ||= {1 => {}, 2 => {}, 3 => {}, 4 => {}, 5 => {}}
|
66
|
-
|
67
|
-
# Generate a unique pseudorandom ID for this hook.
|
68
|
-
id = ''
|
69
|
-
10.times { id += get_rand_char }
|
70
|
-
while @events[event][priority].has_key? id
|
71
|
-
id = ''
|
72
|
-
10.times { id += get_rand_char }
|
73
|
-
end
|
74
|
-
|
75
|
-
# Create the hook in memory.
|
76
|
-
@events[event][priority][id] = cb
|
77
|
-
|
78
|
-
[event, priority, id]
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
# Broadcast an event and associated arguments.
|
83
|
-
#
|
84
|
-
# The arguments are globbed into an array from the list passed to the
|
85
|
-
# method, so be sure to format your call correctly.
|
86
|
-
#
|
87
|
-
# If a hook returns +false+, all subsequent hook executions will be
|
88
|
-
# forestalled from occurring.
|
89
|
-
#
|
90
|
-
# @param [Symbol] event The event being broadcasted.
|
91
|
-
# @param [Array] args A list of arguments which should be passed to
|
92
|
-
# the listeners. (splat)
|
93
|
-
#
|
94
|
-
# @example
|
95
|
-
# events.call(:cow_moo, "the cows", "go moo", [1, 3, 5])
|
96
|
-
#
|
97
|
-
# @see Syndi::DSL::Base#emit
|
98
|
-
def call(event, *args)
|
99
|
-
# Check if any hooks exist for this event.
|
100
|
-
if @events.include? event
|
101
|
-
|
102
|
-
$m.verbose("A thread is spawning for an event broadcast (:#{event}).", VNOISY) do
|
103
|
-
@threads << Thread.new(event) do |evnt|
|
104
|
-
|
105
|
-
status = nil
|
106
|
-
|
107
|
-
begin # catch exceptions
|
108
|
-
# Iterate through the hooks.
|
109
|
-
@events[evnt].each_key do |priority|
|
110
|
-
@events[evnt][priority].each_value do |prc|
|
111
|
-
status = prc.call(*args) unless status == false
|
112
|
-
end # each hook
|
113
|
-
end # each priority
|
114
|
-
rescue => e
|
115
|
-
$m.error "An exception occurred within the thread of :#{event}: #{e}", false, e.backtrace
|
116
|
-
end # begin
|
117
|
-
|
118
|
-
end # thread
|
119
|
-
end # verbose
|
120
|
-
|
121
|
-
end # whether this event exists
|
122
|
-
end
|
123
|
-
|
124
|
-
# Delete a hook or listener.
|
125
|
-
#
|
126
|
-
# @param [Array(Symbol, Integer, String)] id The identification data of the hook,
|
127
|
-
# as provided by #on.
|
128
|
-
#
|
129
|
-
# @see Syndi::DSL::Base#undo_on
|
130
|
-
def del(id)
|
131
|
-
event, priority, hook = id
|
132
|
-
|
133
|
-
if @events.has_key? event
|
134
|
-
if @events[event][priority].has_key? hook
|
135
|
-
@events[event][priority].delete(hook)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
tidy
|
140
|
-
end
|
141
|
-
|
142
|
-
# Terminate all active threads.
|
143
|
-
def die
|
144
|
-
@threads.each { |thr| thr.kill }
|
145
|
-
end
|
146
|
-
|
147
|
-
#######
|
148
|
-
private
|
149
|
-
#######
|
150
|
-
|
151
|
-
# Tidy up.
|
152
|
-
def tidy
|
153
|
-
@events.each do |name, lists|
|
154
|
-
empty = true
|
155
|
-
empty = lists.each_value { |v| break false if not v.empty? }
|
156
|
-
if empty
|
157
|
-
# Drop the event.
|
158
|
-
@events.delete name
|
159
|
-
next
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
end # class Events
|
165
|
-
|
166
|
-
end # module API
|
167
|
-
|
168
|
-
end # module Syndi
|
169
|
-
|
170
|
-
# vim: set ts=4 sts=2 sw=2 et:
|
data/lib/syndi/api/plugin.rb
DELETED
@@ -1,155 +0,0 @@
|
|
1
|
-
# Copyright (c) 2013, Autumn Perrault, et al. All rights reserved.
|
2
|
-
# This free software is distributed under the FreeBSD license (see LICENSE).
|
3
|
-
|
4
|
-
require 'ostruct'
|
5
|
-
require 'libsyndi'
|
6
|
-
require 'syndi/bot'
|
7
|
-
|
8
|
-
module Syndi
|
9
|
-
|
10
|
-
module API
|
11
|
-
|
12
|
-
# A basic superclass for plugins.
|
13
|
-
#
|
14
|
-
# @api Syndi
|
15
|
-
# @since 4.0.0
|
16
|
-
# @author noxgirl
|
17
|
-
# @author swarley
|
18
|
-
#
|
19
|
-
# @!attribute [r] name
|
20
|
-
# @return [String] Name of the plugin.
|
21
|
-
#
|
22
|
-
# @!attribute [r] summary
|
23
|
-
# @return [String] Summary of the plugin.
|
24
|
-
#
|
25
|
-
# @!attribute [r] version
|
26
|
-
# @return [String] Version of the plugin.
|
27
|
-
#
|
28
|
-
# @!attribute [r] library
|
29
|
-
# @return [String] The library upon which the plugin is based.
|
30
|
-
#
|
31
|
-
# @!attribute [r] author
|
32
|
-
# @return [String] Author of the plugin.
|
33
|
-
#
|
34
|
-
# @!attribute [r] syndi
|
35
|
-
# @return [String] Version of Syndi required by the plugin.
|
36
|
-
class Plugin
|
37
|
-
|
38
|
-
attr_reader :name, :summary, :version, :library, :author, :syndi
|
39
|
-
|
40
|
-
# Configure the plugin.
|
41
|
-
#
|
42
|
-
# @yieldparam [OpenStruct] conf Configuration structure.
|
43
|
-
#
|
44
|
-
# - +conf.name+: Name of the plugin (String).
|
45
|
-
# - +conf.summary+: Summary of the plugin (String).
|
46
|
-
# - +conf.version+: Version of the plugin (String).
|
47
|
-
# - +conf.library+: Library upon which the plugin is based. (String).
|
48
|
-
# - +conf.author+: Author of the plugin (String).
|
49
|
-
# - +conf.syndi+: Required version of Syndi (String). Should be in the format of
|
50
|
-
# +'~> version'+ or +'>= version'+. +~>+ means at least +version+ but no later
|
51
|
-
# than the minor version (e.g. +'~> 4.0'+ will allow +4.0.2+ but not +4.1.0+).
|
52
|
-
# +>=+ means at at least +version+.
|
53
|
-
#
|
54
|
-
# Additionally, it should be noted that +conf.library+ should be either of the
|
55
|
-
# core libraries, *or* 'multi' if it uses multiple libraries.
|
56
|
-
#
|
57
|
-
# @example
|
58
|
-
# configure do |c|
|
59
|
-
# c.name = 'MagicPlugin'
|
60
|
-
# c.summary = 'A magical extension.'
|
61
|
-
# c.version = '1.00'
|
62
|
-
# c.library = 'irc'
|
63
|
-
# c.author = 'noxgirl'
|
64
|
-
# c.syndi = '~> 4.0'
|
65
|
-
# end
|
66
|
-
def configure
|
67
|
-
|
68
|
-
# Prepare an open structure.
|
69
|
-
conf = OpenStruct.new
|
70
|
-
|
71
|
-
# Yield it to the configuration block.
|
72
|
-
yield conf if block_given?
|
73
|
-
|
74
|
-
# Check for sufficient configuration.
|
75
|
-
[:name,:summary,:version,:library,:author,:syndi].each do |s|
|
76
|
-
if conf.send(s).nil?
|
77
|
-
raise PluginError, "Plugin #{self.inspect} provided insufficient configuration (#{s} is nil)."
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
@name = conf.name
|
82
|
-
@summary = conf.summary
|
83
|
-
@version = conf.version
|
84
|
-
@library = conf.library
|
85
|
-
@author = conf.author
|
86
|
-
|
87
|
-
# Check for compatibility.
|
88
|
-
if conf.syndi =~ /^(~>\s*)((?:[\dabcr])(?:\.[\dabcr]))+$/ # ~>
|
89
|
-
|
90
|
-
ver = $2
|
91
|
-
if Gem::Version.new(ver.dup) >= Gem::Version.new(Syndi::VERSION.dup) # must be later than or equal to current
|
92
|
-
|
93
|
-
# Split current version and plugin-demanded version by '.'.
|
94
|
-
verarr = Syndi::VERSION.split(/\./)
|
95
|
-
pverarr = ver.split(/\./)
|
96
|
-
|
97
|
-
# Must be no later than the current minor version
|
98
|
-
unless verarr[1] <= pverarr[1]
|
99
|
-
raise PluginError, "Plugin #@name v#@version demands Syndi #{conf.syndi}; current version is #{Syndi::VERSION}. Incompatible! Aborting load!"
|
100
|
-
end
|
101
|
-
|
102
|
-
@syndi = conf.syndi
|
103
|
-
|
104
|
-
else
|
105
|
-
raise PluginError, "Plugin #@name v#@version demands Syndi #{conf.syndi}; current version is #{Syndi::VERSION}. Incompatible! Aborting load!"
|
106
|
-
end # if ver >=
|
107
|
-
|
108
|
-
elsif conf.syndi =~ /^(>=\s*)((?:[\dabcr])(?:\.[\dabcr]))+$/ # >=
|
109
|
-
|
110
|
-
ver = $2
|
111
|
-
unless ver >= Syndi::VERSION # must be later than or equal to current
|
112
|
-
raise PluginError, "Plugin #@name v#@version demands Syndi #{conf.syndi}; current version is #{Syndi::VERSION}. Incompatible! Aborting load!"
|
113
|
-
end
|
114
|
-
|
115
|
-
@syndi = conf.syndi
|
116
|
-
|
117
|
-
else
|
118
|
-
raise PluginError, "Plugin #@name v#@version cannot be checked for compatibility. Aborting load!"
|
119
|
-
end # compat check
|
120
|
-
|
121
|
-
# If we've made it this far, it's sufficiently compatible with the API.
|
122
|
-
# Now, we need to extend this plugin with our domain-specific language (DSL).
|
123
|
-
self.extend Syndi::DSL::Base # this is the base
|
124
|
-
case @library
|
125
|
-
|
126
|
-
when 'irc'
|
127
|
-
self.extend Syndi::DSL::IRC
|
128
|
-
when 'multi'
|
129
|
-
# the specifications for multilib DSL functionality are yet undecided
|
130
|
-
else
|
131
|
-
# If it's a library we don't comprehend, exception time, it is.
|
132
|
-
raise PluginError, "Plugin #@name v#@version demands '#{@library}' library, which I do not understand. Aborting load!"
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
end # def configure
|
137
|
-
|
138
|
-
#########
|
139
|
-
protected
|
140
|
-
#########
|
141
|
-
|
142
|
-
# Inheritance event.
|
143
|
-
#
|
144
|
-
# @param [Class] subklass The subclass which has inherited {self}.
|
145
|
-
def self.inherited(subklass)
|
146
|
-
$m.debug("[plugin] Syndi::API::Plugin inherited by #{subklass}")
|
147
|
-
end
|
148
|
-
|
149
|
-
end # class Plugin
|
150
|
-
|
151
|
-
end # module API
|
152
|
-
|
153
|
-
end # module Syndi
|
154
|
-
|
155
|
-
# vim: set ts=4 sts=2 sw=2 et:
|
data/lib/syndi/configure/cli.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# Copyright (c) 2013, Autumn Perrault, et al. All rights reserved.
|
2
|
-
# This free software is distributed under the FreeBSD license (see LICENSE).
|
3
|
-
|
4
|
-
require 'thor'
|
5
|
-
require 'psych'
|
6
|
-
|
7
|
-
module Syndi
|
8
|
-
module Configure
|
9
|
-
|
10
|
-
# A command-line interface for making modifications to an existing Syndi
|
11
|
-
# configuration file (which is in YAML).
|
12
|
-
class CLI < Thor
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
# vim: set ts=4 sts=2 sw=2 et:
|