ssc.bot 0.1.1 → 0.2.0
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/.yardopts +3 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile +0 -18
- data/README.md +17 -42
- data/Rakefile +6 -23
- data/lib/ssc.bot.rb +6 -17
- data/lib/ssc.bot/chat_log.rb +102 -126
- data/lib/ssc.bot/chat_log/message.rb +32 -42
- data/lib/ssc.bot/chat_log/message_parsable.rb +14 -38
- data/lib/ssc.bot/chat_log/message_parser.rb +153 -164
- data/lib/ssc.bot/chat_log/messages.rb +43 -55
- data/lib/ssc.bot/chat_log_file.rb +12 -25
- data/lib/ssc.bot/clu.rb +55 -0
- data/lib/ssc.bot/error.rb +11 -33
- data/lib/ssc.bot/jruby.rb +31 -0
- data/lib/ssc.bot/ssc_file.rb +44 -55
- data/lib/ssc.bot/user.rb +21 -0
- data/lib/ssc.bot/user/jrobot_message_sender.rb +51 -62
- data/lib/ssc.bot/user/message_sender.rb +104 -162
- data/lib/ssc.bot/util.rb +37 -31
- data/lib/ssc.bot/version.rb +4 -16
- data/ssc.bot.gemspec +21 -44
- data/test/test_helper.rb +3 -19
- data/test/util_test.rb +93 -0
- metadata +21 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 988c653f2db596a5d3b9b0e1537f2443e6c41f65842df5ba6a4283a564f7d916
|
4
|
+
data.tar.gz: a272071c621d71f278761f77a34dc787984a86f10ef15fabe48668e7c4d342bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5525a87c8cb6ca2186ee20d596c44c76f6a85e6fb3996b94e314c10510dd4195837c29154951a6afd78251fce6861bf501b77e869320c41880a9da71f376f99
|
7
|
+
data.tar.gz: 7ba1b91a451d94cf01a1f1fab8de7e5892da04cffbca0d3085b162538c58c3b90aca99fcabf00f28e5734844c9fbaf72c51a439767096eb2fe6086e3a588101f
|
data/.yardopts
ADDED
data/CHANGELOG.md
CHANGED
@@ -5,9 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
Format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
-
## [[Unreleased]](https://github.com/esotericpig/ssc.bot/compare/v0.
|
8
|
+
## [[Unreleased]](https://github.com/esotericpig/ssc.bot/compare/v0.2.0...HEAD)
|
9
9
|
-
|
10
10
|
|
11
|
+
|
12
|
+
## [v0.2.0] - [2021-06-22](https://github.com/esotericpig/ssc.bot/compare/v0.1.1...v0.2.0)
|
13
|
+
### Changed
|
14
|
+
- Renamed `SSCBot::SSCFile#get_line()` to `read_uline()` due to RuboCop complaining about using `get_`.
|
15
|
+
- Formatted all code with RuboCop.
|
16
|
+
- Formatted all files.
|
17
|
+
- Updated dev Gems.
|
18
|
+
|
19
|
+
|
11
20
|
## [v0.1.1] - [2020-09-09](https://github.com/esotericpig/ssc.bot/compare/v0.1.0...v0.1.1)
|
12
21
|
|
13
22
|
### Added
|
@@ -24,6 +33,7 @@ and this project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec
|
|
24
33
|
### Fixed
|
25
34
|
- `Util.u_blank?(str)`
|
26
35
|
|
36
|
+
|
27
37
|
## [v0.1.0] - [2020-08-29](https://github.com/esotericpig/ssc.bot/tree/v0.1.0)
|
28
38
|
|
29
39
|
First working version.
|
data/Gemfile
CHANGED
@@ -1,24 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
#--
|
5
|
-
# This file is part of SSC.Bot.
|
6
|
-
# Copyright (c) 2020 Jonathan Bradley Whited (@esotericpig)
|
7
|
-
#
|
8
|
-
# SSC.Bot is free software: you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
10
|
-
# the Free Software Foundation, either version 3 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# SSC.Bot is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU Lesser General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU Lesser General Public License
|
19
|
-
# along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
|
20
|
-
#++
|
21
|
-
|
22
4
|
|
23
5
|
source 'https://rubygems.org'
|
24
6
|
|
data/README.md
CHANGED
@@ -12,48 +12,15 @@ It's currently in development and only offers limited functionality.
|
|
12
12
|
|
13
13
|
## Contents
|
14
14
|
|
15
|
-
- [Setup](#-setup)
|
16
15
|
- [Using](#-using)
|
17
16
|
- [Hacking](#-hacking)
|
18
17
|
- [License](#-license)
|
19
18
|
|
20
|
-
## [//](#contents)
|
21
|
-
|
22
|
-
Pick your poison...
|
23
|
-
|
24
|
-
In your Gemspec (*<project>*.gemspec):
|
25
|
-
|
26
|
-
```Ruby
|
27
|
-
# Pick one...
|
28
|
-
spec.add_runtime_dependency 'ssc.bot', '~> X.X'
|
29
|
-
spec.add_development_dependency 'ssc.bot', '~> X.X'
|
30
|
-
```
|
31
|
-
|
32
|
-
In your Gemfile:
|
33
|
-
|
34
|
-
```Ruby
|
35
|
-
# Pick one...
|
36
|
-
gem 'ssc.bot', '~> X.X'
|
37
|
-
gem 'ssc.bot', '~> X.X', group: :development
|
38
|
-
gem 'ssc.bot', git: 'https://github.com/esotericpig/ssc.bot.git', tag: 'vX.X.X'
|
39
|
-
```
|
40
|
-
|
41
|
-
With the RubyGems package manager:
|
42
|
-
|
43
|
-
```
|
44
|
-
$ gem install ssc.bot
|
45
|
-
```
|
19
|
+
## [//](#contents) Using
|
46
20
|
|
47
|
-
|
21
|
+
Gem name: `ssc.bot`
|
48
22
|
|
49
|
-
|
50
|
-
$ git clone 'https://github.com/esotericpig/ssc.bot.git'
|
51
|
-
$ cd ssc.bot
|
52
|
-
$ bundle install
|
53
|
-
$ bundle exec rake install:local
|
54
|
-
```
|
55
|
-
|
56
|
-
## [//](#contents) Using
|
23
|
+
See [SSC.Nob](https://github.com/esotericpig/ssc.nob) for example usage.
|
57
24
|
|
58
25
|
TODO: readme.using
|
59
26
|
|
@@ -86,20 +53,28 @@ $ bundle exec rake install:local
|
|
86
53
|
|
87
54
|
### Releasing
|
88
55
|
|
89
|
-
1.
|
90
|
-
- `$
|
91
|
-
2. Check for updates
|
56
|
+
1. Check for updates
|
57
|
+
- `$ git pull`
|
92
58
|
- `$ bundle update`
|
93
59
|
- `$ bundle outdated`
|
94
|
-
|
95
|
-
|
60
|
+
2. Update *CHANGELOG.md* & *version.rb*
|
61
|
+
- `$ raketary bump -v`
|
62
|
+
- `$ raketary bump --patch`
|
63
|
+
- `$ bundle update`
|
64
|
+
3. Release to *GitHub* & *GitHub Packages*
|
65
|
+
- `$ bundle exec rake clobber build`
|
66
|
+
- `$ gh release create v0.0.0 pkg/*.gem`
|
67
|
+
- `$ git fetch --tags origin`
|
68
|
+
- `$ raketary github_pkg`
|
69
|
+
4. Release to *RubyGems*
|
70
|
+
- `$ bundle exec rake release`
|
96
71
|
|
97
72
|
## [//](#contents) License
|
98
73
|
|
99
74
|
[GNU LGPL v3+](LICENSE.txt)
|
100
75
|
|
101
76
|
> SSC.Bot (<https://github.com/esotericpig/ssc.bot>)
|
102
|
-
> Copyright (c) 2020 Jonathan Bradley Whited
|
77
|
+
> Copyright (c) 2020-2021 Jonathan Bradley Whited
|
103
78
|
>
|
104
79
|
> SSC.Bot is free software: you can redistribute it and/or modify
|
105
80
|
> it under the terms of the GNU Lesser General Public License as published by
|
data/Rakefile
CHANGED
@@ -1,52 +1,35 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
#--
|
5
|
-
# This file is part of SSC.Bot.
|
6
|
-
# Copyright (c) 2020 Jonathan Bradley Whited (@esotericpig)
|
7
|
-
#
|
8
|
-
# SSC.Bot is free software: you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
10
|
-
# the Free Software Foundation, either version 3 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# SSC.Bot is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU Lesser General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU Lesser General Public License
|
19
|
-
# along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
|
20
|
-
#++
|
21
|
-
|
22
4
|
|
23
5
|
require 'bundler/gem_tasks'
|
24
6
|
|
7
|
+
require 'yard'
|
8
|
+
|
25
9
|
require 'rake/clean'
|
26
10
|
require 'rake/testtask'
|
27
|
-
require 'yard'
|
28
11
|
|
29
12
|
require 'ssc.bot/version'
|
30
13
|
|
31
|
-
|
32
14
|
CLEAN.exclude('{.git,stock}/**/*')
|
33
15
|
CLOBBER.include('doc/')
|
34
16
|
|
35
17
|
task default: [:test]
|
36
18
|
|
37
19
|
desc 'Generate documentation'
|
38
|
-
task :
|
20
|
+
task doc: [:yard] do |task|
|
39
21
|
end
|
40
22
|
|
41
|
-
Rake::TestTask.new
|
23
|
+
Rake::TestTask.new do |task|
|
42
24
|
task.libs = ['lib','test']
|
43
25
|
task.pattern = File.join('test','**','*_test.rb')
|
44
26
|
task.description += ": '#{task.pattern}'"
|
27
|
+
task.options = '--pride'
|
45
28
|
task.verbose = false
|
46
29
|
task.warning = true
|
47
30
|
end
|
48
31
|
|
49
|
-
YARD::Rake::YardocTask.new
|
32
|
+
YARD::Rake::YardocTask.new do |task|
|
50
33
|
#task.options.push('--template-path',File.join('yard','templates'))
|
51
34
|
task.options.push('--title',"SSC.Bot v#{SSCBot::VERSION} Doc")
|
52
35
|
end
|
data/lib/ssc.bot.rb
CHANGED
@@ -1,30 +1,20 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of SSC.Bot.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# SSC.Bot is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
24
12
|
require 'ssc.bot/chat_log'
|
25
13
|
require 'ssc.bot/chat_log_file'
|
14
|
+
require 'ssc.bot/clu'
|
26
15
|
require 'ssc.bot/error'
|
27
16
|
require 'ssc.bot/ssc_file'
|
17
|
+
require 'ssc.bot/user'
|
28
18
|
require 'ssc.bot/util'
|
29
19
|
require 'ssc.bot/version'
|
30
20
|
|
@@ -35,9 +25,8 @@ require 'ssc.bot/chat_log/messages'
|
|
35
25
|
|
36
26
|
require 'ssc.bot/user/message_sender'
|
37
27
|
|
38
|
-
|
39
28
|
###
|
40
|
-
# @author Jonathan Bradley Whited
|
29
|
+
# @author Jonathan Bradley Whited
|
41
30
|
# @since 0.1.0
|
42
31
|
###
|
43
32
|
module SSCBot
|
data/lib/ssc.bot/chat_log.rb
CHANGED
@@ -1,23 +1,11 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# encoding: UTF-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
4
|
#--
|
6
5
|
# This file is part of SSC.Bot.
|
7
|
-
# Copyright (c) 2020 Jonathan Bradley Whited
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it under the terms of the GNU Lesser General Public License as published by
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
12
|
-
# (at your option) any later version.
|
13
|
-
#
|
14
|
-
# SSC.Bot is distributed in the hope that it will be useful,
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
17
|
-
# GNU Lesser General Public License for more details.
|
18
|
-
#
|
19
|
-
# You should have received a copy of the GNU Lesser General Public License
|
20
|
-
# along with SSC.Bot. If not, see <https://www.gnu.org/licenses/>.
|
6
|
+
# Copyright (c) 2020-2021 Jonathan Bradley Whited
|
7
|
+
#
|
8
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
21
9
|
#++
|
22
10
|
|
23
11
|
|
@@ -31,15 +19,15 @@ require 'ssc.bot/chat_log/message_parsable'
|
|
31
19
|
require 'ssc.bot/chat_log/message_parser'
|
32
20
|
require 'ssc.bot/chat_log/messages'
|
33
21
|
|
34
|
-
|
35
22
|
module SSCBot
|
36
23
|
###
|
37
|
-
# @author Jonathan Bradley Whited
|
24
|
+
# @author Jonathan Bradley Whited
|
38
25
|
# @since 0.1.0
|
39
26
|
###
|
40
27
|
class ChatLog
|
28
|
+
extend AttrBool::Ext
|
41
29
|
include MessageParsable
|
42
|
-
|
30
|
+
|
43
31
|
attr_reader? :alive
|
44
32
|
attr_accessor :file_mode
|
45
33
|
attr_reader :file_opt
|
@@ -47,10 +35,10 @@ module SSCBot
|
|
47
35
|
attr_accessor :idle_secs
|
48
36
|
attr_reader :observers
|
49
37
|
attr_reader :thread
|
50
|
-
|
38
|
+
|
51
39
|
def initialize(filename,file_mode: 'rt',file_opt: {},idle_secs: 0.250,**parser_kargs)
|
52
40
|
super()
|
53
|
-
|
41
|
+
|
54
42
|
@alive = false
|
55
43
|
@file_mode = file_mode
|
56
44
|
@file_opt = file_opt
|
@@ -58,224 +46,212 @@ module SSCBot
|
|
58
46
|
@idle_secs = idle_secs
|
59
47
|
@observers = {}
|
60
48
|
@parser = MessageParser.new(**parser_kargs)
|
61
|
-
@semaphore = Mutex.new
|
49
|
+
@semaphore = Mutex.new
|
62
50
|
@thread = nil
|
63
51
|
end
|
64
|
-
|
52
|
+
|
65
53
|
def add_observer(observer=nil,*funcs,type: :any,&block)
|
66
|
-
if observer.nil?
|
54
|
+
if observer.nil? && block.nil?
|
67
55
|
raise ArgumentError,'no observer'
|
68
56
|
end
|
69
|
-
|
57
|
+
|
70
58
|
check_type(type)
|
71
|
-
|
59
|
+
|
72
60
|
type_observers = fetch_observers(type: type)
|
73
|
-
|
74
|
-
if !observer.nil?
|
75
|
-
funcs << :call if funcs.empty?
|
76
|
-
|
61
|
+
|
62
|
+
if !observer.nil?
|
63
|
+
funcs << :call if funcs.empty?
|
64
|
+
|
77
65
|
type_observers << Observer.new(observer,*funcs)
|
78
66
|
end
|
79
|
-
|
80
|
-
if !block.nil?
|
67
|
+
|
68
|
+
if !block.nil?
|
81
69
|
type_observers << Observer.new(block,:call)
|
82
70
|
end
|
83
71
|
end
|
84
|
-
|
72
|
+
|
85
73
|
def add_observers(*observers,type: :any,func: :call,&block)
|
86
|
-
if observers.empty?
|
74
|
+
if observers.empty? && block.nil?
|
87
75
|
raise ArgumentError,'no observer'
|
88
76
|
end
|
89
|
-
|
77
|
+
|
90
78
|
check_type(type)
|
91
|
-
|
79
|
+
|
92
80
|
type_observers = fetch_observers(type: type)
|
93
|
-
|
94
|
-
observers.each
|
81
|
+
|
82
|
+
observers.each do |observer|
|
95
83
|
type_observers << Observer.new(observer,func)
|
96
84
|
end
|
97
|
-
|
98
|
-
if !block.nil?
|
85
|
+
|
86
|
+
if !block.nil?
|
99
87
|
type_observers << Observer.new(block,:call)
|
100
88
|
end
|
101
89
|
end
|
102
|
-
|
90
|
+
|
103
91
|
def check_type(type,nil_ok: false)
|
104
|
-
if type.nil?
|
92
|
+
if type.nil?
|
105
93
|
if !nil_ok
|
106
|
-
raise ArgumentError,"invalid type{#{type.inspect
|
94
|
+
raise ArgumentError,"invalid type{#{type.inspect}}"
|
107
95
|
end
|
108
96
|
else
|
109
97
|
if type != :any && !Message.valid_type?(type)
|
110
|
-
raise ArgumentError,"invalid type{#{type.inspect
|
98
|
+
raise ArgumentError,"invalid type{#{type.inspect}}"
|
111
99
|
end
|
112
100
|
end
|
113
101
|
end
|
114
|
-
|
115
|
-
def clear_content
|
102
|
+
|
103
|
+
def clear_content
|
116
104
|
SSCFile.clear(@filename)
|
117
105
|
end
|
118
|
-
|
106
|
+
|
119
107
|
def count_observers(type: nil)
|
120
108
|
check_type(type,nil_ok: true)
|
121
|
-
|
109
|
+
|
122
110
|
count = 0
|
123
|
-
|
124
|
-
if type.nil?
|
125
|
-
@observers.each_value
|
111
|
+
|
112
|
+
if type.nil?
|
113
|
+
@observers.each_value do |type_observers|
|
126
114
|
count += type_observers.length
|
127
115
|
end
|
128
116
|
else
|
129
117
|
type_observers = @observers[type]
|
130
|
-
|
131
|
-
if !type_observers.nil?
|
118
|
+
|
119
|
+
if !type_observers.nil?
|
132
120
|
count += type_observers.length
|
133
121
|
end
|
134
122
|
end
|
135
|
-
|
123
|
+
|
136
124
|
return count
|
137
125
|
end
|
138
|
-
|
126
|
+
|
139
127
|
def delete_observer(observer,type: nil)
|
140
128
|
delete_observers(observer,type: type)
|
141
129
|
end
|
142
|
-
|
130
|
+
|
143
131
|
def delete_observers(*observers,type: nil)
|
144
132
|
check_type(type,nil_ok: true)
|
145
|
-
|
146
|
-
if observers.empty?
|
147
|
-
if type.nil?
|
148
|
-
@observers.clear
|
133
|
+
|
134
|
+
if observers.empty?
|
135
|
+
if type.nil?
|
136
|
+
@observers.clear
|
149
137
|
else
|
150
|
-
|
151
|
-
|
152
|
-
if !type_observers.nil?()
|
153
|
-
type_observers.clear()
|
154
|
-
end
|
138
|
+
@observers[type]&.clear
|
155
139
|
end
|
156
140
|
else
|
157
|
-
observers = observers.to_set
|
158
|
-
|
159
|
-
if type.nil?
|
160
|
-
@observers.each_value
|
161
|
-
type_observers.delete_if
|
141
|
+
observers = observers.to_set
|
142
|
+
|
143
|
+
if type.nil?
|
144
|
+
@observers.each_value do |type_observers|
|
145
|
+
type_observers.delete_if do |observer|
|
162
146
|
observers.include?(observer.object)
|
163
147
|
end
|
164
148
|
end
|
165
149
|
else
|
166
|
-
|
167
|
-
|
168
|
-
if !type_observers.nil?()
|
169
|
-
type_observers.delete_if() do |observer|
|
170
|
-
observers.include?(observer.object)
|
171
|
-
end
|
150
|
+
@observers[type]&.delete_if do |observer|
|
151
|
+
observers.include?(observer.object)
|
172
152
|
end
|
173
153
|
end
|
174
154
|
end
|
175
155
|
end
|
176
|
-
|
156
|
+
|
177
157
|
def fetch_observers(type: :any)
|
178
158
|
check_type(type)
|
179
|
-
|
159
|
+
|
180
160
|
type_observers = @observers[type]
|
181
|
-
|
182
|
-
if type_observers.nil?
|
161
|
+
|
162
|
+
if type_observers.nil?
|
183
163
|
type_observers = []
|
184
164
|
@observers[type] = type_observers
|
185
165
|
end
|
186
|
-
|
166
|
+
|
187
167
|
return type_observers
|
188
168
|
end
|
189
|
-
|
169
|
+
|
190
170
|
def notify_observers(message)
|
191
171
|
any_observers = @observers[:any]
|
192
172
|
type_observers = @observers[message.type]
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
observer.notify(self,message)
|
197
|
-
end
|
173
|
+
|
174
|
+
any_observers&.each do |observer|
|
175
|
+
observer.notify(self,message)
|
198
176
|
end
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
observer.notify(self,message)
|
203
|
-
end
|
177
|
+
|
178
|
+
type_observers&.each do |observer|
|
179
|
+
observer.notify(self,message)
|
204
180
|
end
|
205
181
|
end
|
206
|
-
|
182
|
+
|
207
183
|
def run(seek_to_end: true)
|
208
|
-
@semaphore.synchronize
|
184
|
+
@semaphore.synchronize do
|
209
185
|
return if @alive # Already running
|
210
186
|
end
|
211
|
-
|
212
|
-
stop
|
213
|
-
|
214
|
-
@semaphore.synchronize
|
187
|
+
|
188
|
+
stop # Justin Case
|
189
|
+
|
190
|
+
@semaphore.synchronize do
|
215
191
|
@alive = true
|
216
|
-
|
217
|
-
soft_touch
|
218
|
-
|
219
|
-
@thread = Thread.new
|
192
|
+
|
193
|
+
soft_touch # Create the file if it doesn't exist
|
194
|
+
|
195
|
+
@thread = Thread.new do
|
220
196
|
SSCFile.open(@filename,@file_mode,**@file_opt) do |fin|
|
221
|
-
fin.seek_to_end
|
222
|
-
|
197
|
+
fin.seek_to_end if seek_to_end
|
198
|
+
|
223
199
|
while @alive
|
224
|
-
while !(line = fin.
|
200
|
+
while !(line = fin.read_uline).nil?
|
225
201
|
message = @parser.parse(line)
|
226
|
-
|
202
|
+
|
227
203
|
notify_observers(message)
|
228
204
|
end
|
229
|
-
|
205
|
+
|
230
206
|
sleep(@idle_secs)
|
231
207
|
end
|
232
208
|
end
|
233
209
|
end
|
234
210
|
end
|
235
211
|
end
|
236
|
-
|
237
|
-
def soft_touch
|
212
|
+
|
213
|
+
def soft_touch
|
238
214
|
SSCFile.soft_touch(@filename)
|
239
215
|
end
|
240
|
-
|
216
|
+
|
241
217
|
def stop(wait_secs=5)
|
242
|
-
@semaphore.synchronize
|
218
|
+
@semaphore.synchronize do
|
243
219
|
@alive = false
|
244
|
-
|
245
|
-
if !@thread.nil?
|
246
|
-
if @thread.alive?
|
220
|
+
|
221
|
+
if !@thread.nil?
|
222
|
+
if @thread.alive?
|
247
223
|
# First, try to kill it gracefully (waiting X secs).
|
248
224
|
@thread.join(@idle_secs + wait_secs)
|
249
|
-
|
225
|
+
|
250
226
|
# Die!
|
251
|
-
@thread.kill
|
227
|
+
@thread.kill if @thread.alive?
|
252
228
|
end
|
253
|
-
|
229
|
+
|
254
230
|
@thread = nil
|
255
231
|
end
|
256
232
|
end
|
257
233
|
end
|
258
|
-
|
234
|
+
|
259
235
|
###
|
260
|
-
# @author Jonathan Bradley Whited
|
236
|
+
# @author Jonathan Bradley Whited
|
261
237
|
# @since 0.1.0
|
262
238
|
###
|
263
239
|
class Observer
|
264
240
|
attr_reader :funcs
|
265
241
|
attr_reader :object
|
266
|
-
|
242
|
+
|
267
243
|
def initialize(object,*funcs)
|
268
244
|
super()
|
269
|
-
|
270
|
-
raise ArgumentError,'empty funcs' if funcs.empty?
|
271
|
-
|
245
|
+
|
246
|
+
raise ArgumentError,'empty funcs' if funcs.empty?
|
247
|
+
|
272
248
|
@funcs = funcs
|
273
249
|
@object = object
|
274
250
|
end
|
275
|
-
|
276
|
-
def notify(
|
277
|
-
@funcs.each
|
278
|
-
@object.__send__(func,
|
251
|
+
|
252
|
+
def notify(chat_log,message)
|
253
|
+
@funcs.each do |func|
|
254
|
+
@object.__send__(func,chat_log,message)
|
279
255
|
end
|
280
256
|
end
|
281
257
|
end
|