aniview 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@ require 'fileutils'
2
2
  require 'json'
3
3
 
4
4
  require_relative 'prefitem'
5
- require_relative '../../view/emote.rb'
5
+ require_relative '../../view/color'
6
6
  require_relative '../../util/alogger'
7
7
 
8
8
  class Pref
@@ -80,7 +80,7 @@ class Pref
80
80
  }
81
81
 
82
82
  when "color"
83
- return false if not $clr.key? destination
83
+ return false if not Color.method_defined? destination
84
84
 
85
85
  when "int"
86
86
  return false if not destination.scan(/\D/).empty? and destination.length > 1
@@ -72,6 +72,7 @@
72
72
  "title" : "any",
73
73
  "parent" : "any"
74
74
  },
75
+ "format_status" : "any",
75
76
  "deluge_config" :
76
77
  {
77
78
  "host" : "any",
@@ -88,11 +89,12 @@
88
89
  {
89
90
  "port" : "int"
90
91
  },
92
+ "set_watched_percentage" : "int",
91
93
  "log_file" : "path",
92
94
  "daemon_log_file" : "path",
93
95
  "watch_log" : "path",
94
96
  "conf_dir" : "locked",
95
- "watch_command" : "any",
97
+ "mpv_args" : "any",
96
98
  "local_anime" : "any",
97
99
  "schedule" : "any"
98
100
  }
@@ -1,7 +1,7 @@
1
- require 'base64'
2
1
  require 'fileutils'
3
2
 
4
3
  require_relative 'scheduleitem'
4
+ require_relative '../../util/serializer'
5
5
 
6
6
  class Schedule
7
7
 
@@ -22,6 +22,26 @@ class Schedule
22
22
  return @schedule
23
23
  end
24
24
 
25
+ def getAllCereal
26
+ r=""
27
+ getAll.each { |si| r+=si.cereal }
28
+ return r
29
+ end
30
+
31
+ def mergeItems items
32
+ items.each { |item|
33
+ @schedule.each { |schedule_item|
34
+ if item.id == schedule_item.id
35
+ m = [schedule_item.attributes["m"], item.attributes["m"]]
36
+ if m[0] != m[1]
37
+ schedule_item.setmatched m[1]
38
+ end
39
+ end
40
+ }
41
+ }
42
+ save
43
+ end
44
+
25
45
  def addItem item
26
46
  @schedule.delete_at 0 if @schedule[0].attributes["t"] == "no schedule"
27
47
 
@@ -50,14 +70,14 @@ class Schedule
50
70
  end
51
71
 
52
72
  def save
53
- @pref.set "schedule", Base64.encode64(Marshal.dump @schedule)
73
+ @pref.set "schedule", (Serializer.e @schedule)
54
74
  end
55
75
 
56
76
  def load
57
77
  @pref.load
58
78
  raw = @pref.get "schedule"
59
79
  if not raw == nil and raw.class == String
60
- @schedule = Marshal.load(Base64.decode64(raw))
80
+ @schedule = Serializer.d raw
61
81
  else
62
82
  empty?
63
83
  end
@@ -16,7 +16,7 @@ class ScheduleItem < Item
16
16
  }
17
17
 
18
18
  @lastseen = 0
19
- #@id = SecureRandom.uuid
19
+ @id = SecureRandom.uuid
20
20
  end
21
21
 
22
22
  def updataDir nd
@@ -41,6 +41,16 @@ class ScheduleItem < Item
41
41
 
42
42
  def setSeen
43
43
  @lastseen = Time.now.to_s
44
+ @attr["m"] = @lastseen
45
+ end
46
+
47
+ def setmatched date
48
+ @attr["m"] = date
49
+ end
50
+
51
+ def id
52
+ id = SecureRandom.uuid if @id == nil
53
+ @id
44
54
  end
45
55
 
46
56
  end
@@ -13,6 +13,10 @@ class Subscription
13
13
  @delugec = delugec
14
14
  end
15
15
 
16
+ def log s
17
+ puts "#{Time.now.to_s} [subscription] " + s
18
+ end
19
+
16
20
  def checkDaemon
17
21
  if @c.server?
18
22
  "daemon up"
@@ -21,6 +25,14 @@ class Subscription
21
25
  end
22
26
  end
23
27
 
28
+ def getLastChecked
29
+ @c.lastchecked
30
+ end
31
+
32
+ def syncMatches
33
+ @schedule.mergeItems @c.getItems
34
+ end
35
+
24
36
  def updateFeed
25
37
  begin
26
38
  @rss = SimpleRSS.parse open(@pref.get("rss_feed")["url"])
@@ -28,8 +40,8 @@ class Subscription
28
40
  rescue SocketError
29
41
  @rss = nil
30
42
 
31
- rescue
32
- @rss = nil
43
+ #rescue
44
+ # @rss = nil
33
45
 
34
46
  end
35
47
  end
@@ -38,39 +50,44 @@ class Subscription
38
50
  @rss
39
51
  end
40
52
 
41
- def getLastChecked
42
- @c.lastchecked
43
- end
44
-
45
- def match regexp
46
- updateFeed if @rss == nil
47
- return [] if @rss == nil
53
+ def match regexp, verbose=false
48
54
  re = Regexp.new regexp
49
55
  matches = []
50
56
  @rss.items.each{ |item|
57
+ #log "-> checking against #{item[:title]}" if verbose
51
58
  re.match item[:title] { matches << item }
52
59
  }
53
60
  return matches
54
61
  end
55
62
 
56
- def matchAll
63
+ def matchAll (verbose: false)
64
+ updateFeed if @rss == nil
65
+ return [] if @rss == nil
66
+
67
+ log "matching all" if verbose
68
+
57
69
  total_matches = 0
58
- getAll.each { |subs|
59
- matches = match subs.attributes["r"]
70
+ getAll.each { |subs|
71
+ log "matching #{subs.attributes["r"]}" if verbose
72
+ matches = match subs.attributes["r"], verbose
73
+ log "found #{matches.length} matches" if verbose
74
+ log "#{matches}" if verbose
75
+
60
76
  if matches.length >= 1
61
77
 
62
78
  downloaddir = @pref.parseDir(subs.attributes["p"]) + "/"
63
79
  newfile = downloaddir + matches[0][:title]
64
80
 
65
81
  next if File.exist? newfile
66
-
67
- s = @delugec.addTorrent matches[0][:link], @pref.parseDir(subs.attributes["p"])
82
+ log "set download dir to #{newfile}" if verbose
83
+ s = @delugec.addTorrent matches[0][:link], @pref.parseDir(subs.attributes["p"]), verbose: true
84
+ log "adding torrent, status #{s}" if verbose
68
85
  subs.setSeen if s
69
86
  @schedule.save
70
87
  total_matches+=1
71
-
72
88
  end
73
89
  }
90
+ log "match complete, #{total_matches} found" if verbose
74
91
  return total_matches
75
92
  end
76
93
 
@@ -82,7 +99,6 @@ class Subscription
82
99
  end
83
100
 
84
101
  def getAll
85
- @schedule.load
86
102
  @schedule.getAll
87
103
  end
88
104
 
@@ -11,7 +11,7 @@ class ALogger
11
11
 
12
12
  def log(string)
13
13
 
14
- open(@logfile, 'a') { |f| f.puts "#{Time.now.to_s} string" }
14
+ open(@logfile, 'a') { |f| f.puts "#{Time.now.to_s} #{string}" }
15
15
 
16
16
  end
17
17
 
@@ -1,11 +1,12 @@
1
1
  require 'readline'
2
+ require_relative '../view/color'
2
3
 
3
4
  class Command
4
5
  def self.read(term, prompt = "", default = "")
5
6
 
6
7
  term.bold.echo_on
7
8
 
8
- print "\033[" + String(term.rows) + ";1H"
9
+ print "\033[" + String(term.rows) + ";1H" + Color.white
9
10
  term.show_cursor
10
11
 
11
12
  Readline.completion_append_character = ""
@@ -3,11 +3,11 @@ class Format
3
3
  hours = Integer((v-(v%3600))/3600)
4
4
  minutes = Integer( ((v-(v%60))/60) - (hours * 60))
5
5
  seconds = Integer(v%60)
6
+ seconds = "0" + String(seconds) if seconds < 10
6
7
  if hours < 1 and minutes < 1
7
- return String(seconds)
8
+ "0:#{seconds}"
8
9
  else
9
- seconds = "0" + String(seconds) if seconds < 10
10
- if hours < 1
10
+ if hours < 1
11
11
  return "#{String(minutes)}:#{String(seconds)}"
12
12
  else
13
13
  minutes = "0" + String(minutes) if minutes < 10
@@ -85,7 +85,7 @@ class Format
85
85
  mode = "char"
86
86
 
87
87
  elsif mode == "$"
88
- add_to += String($emote[c]) if $emote.key?(c)
88
+ #add_to += String($emote[c]) if $emote.key?(c)
89
89
  mode = "char"
90
90
 
91
91
  else
@@ -95,6 +95,8 @@ class Format
95
95
  }
96
96
  pstr << add_to
97
97
 
98
+ buffer_char << " " if buffer_char.length == 0
99
+
98
100
  midstr = ""
99
101
  tl = 0
100
102
  pstr.each{ |s| tl += s.length }
@@ -116,6 +118,6 @@ class Format
116
118
  }
117
119
  midstr += pstr[pstr.length - 1]
118
120
 
119
- return midstr
121
+ return midstr[0..cols-1]
120
122
  end
121
123
  end
@@ -0,0 +1,19 @@
1
+ require 'base64'
2
+
3
+ class Serializer
4
+
5
+ def self.e d
6
+ Base64.strict_encode64(Marshal.dump d)
7
+ end
8
+
9
+ def self.d e
10
+ begin
11
+ Marshal.load(Base64.decode64(e))
12
+ rescue ArgumentError
13
+ {}
14
+ rescue TypeError
15
+ {}
16
+ end
17
+ end
18
+
19
+ end
@@ -45,8 +45,8 @@ class AioMenu < Menu
45
45
  refresh
46
46
  elsif key == "enter"
47
47
 
48
- @interface.watch(path)
49
- @interface.addWatched(path)
48
+ @interface.watch(@items.values[sel["out"]][sel["in"]])
49
+ #@interface.addWatched(path)
50
50
  @interface.logWatched(path)
51
51
 
52
52
  #@malanime.update(path)
@@ -0,0 +1,67 @@
1
+ class Color
2
+
3
+ def self.black
4
+ "\e[30m"
5
+ end
6
+
7
+ def self.red
8
+ "\e[31m"
9
+ end
10
+
11
+ def self.green
12
+ "\e[32m"
13
+ end
14
+
15
+ def self.yellow
16
+ "\e[33m"
17
+ end
18
+
19
+ def self.blue
20
+ "\e[34m"
21
+ end
22
+
23
+ def self.magenta
24
+ "\e[35m"
25
+ end
26
+
27
+ def self.cyan
28
+ "\e[36m"
29
+ end
30
+
31
+ def self.white
32
+ "\e[37m"
33
+ end
34
+
35
+ def self.bright_black
36
+ "\e[37m"
37
+ end
38
+
39
+ def self.bright_red
40
+ "\e[38m"
41
+ end
42
+
43
+ def self.bright_green
44
+ "\e[39m"
45
+ end
46
+
47
+ def self.bright_yellow
48
+ "\e[40m"
49
+ end
50
+
51
+ def self.bright_blue
52
+ "\e[41m"
53
+ end
54
+
55
+ def self.bright_magenta
56
+ "\e[42m"
57
+ end
58
+
59
+ def self.bright_cyan
60
+ "\e[43m"
61
+ end
62
+
63
+ def self.bright_white
64
+ "\e[44m"
65
+ end
66
+
67
+ end
@@ -33,6 +33,10 @@ class DelugeMenu < Menu
33
33
  @interface.removeTorrent(item, true)
34
34
  elsif key == "enter"
35
35
 
36
+ elsif key == "+"
37
+ newval = Command.read(@term, "mag:", "")
38
+ @interface.addTorrent newval, Dir.home + "/downloads/"
39
+
36
40
  end
37
41
  end
38
42
 
@@ -1,97 +1,345 @@
1
- #define ascii codes for color names
2
- $clr = Hash[
3
- "black" => "\e[30m", "red" => "\e[31m", "green" => "\e[32m", "yellow" => "\e[33m", "blue" => "\e[34m", "magenta" => "\e[35m", "cyan" => "\e[36m", "white" => "\e[37m",
4
- "bright_black" => "\e[37m", "bright_red" => "\e[38m", "bright_green" => "\e[39m", "bright_yellow" => "\e[40m", "bright_blue" => "\e[41m", "bright_magenta" => "\e[42m", "bright_cyan" => "\e[43m", "bright_white" => "\e[44m",
5
- ]
6
-
7
- $emote = {
8
- "amazed" => '( ゚д゚)',
9
- "a" => '( ゚д゚)',
10
- "angry" => '(#゚Д゚)',
11
- "b" => '(#゚Д゚)',
12
- "bad" => '(・A・)',
13
- "c" => '(・A・)',
14
- "bowing" => 'm(_ _)m',
15
- "d" => 'm(_ _)m',
16
- "bun" => '⊂二二二( ^ω^)二⊃',
17
- "e" => '⊂二二二( ^ω^)二⊃',
18
- "carefree" => '(´∀`)',
19
- "f" => '(´∀`)',
20
- "chinese" => '(`ハ´)',
21
- "g" => '(`ハ´)',
22
- "crying" => '( ´Д⊂ヽ',
23
- "h" => '(´Д⊂ヽ',
24
- "deflagged" => '[゚д゚]',
25
- "i" => '[゚д゚]',
26
- "deflated" => '(´・ω・`)',
27
- "j" => '(´・ω・`)',
28
- "depressed" => ' ´,_ゝ`)',
29
- "k" => '( ´,_ゝ`)',
30
- "dontknow" => '┐(`~`;)┌',
31
- "l" => '┐(`~`;)┌',
32
- "evillaugh" => '( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \',
33
- "m" => '( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \',
34
- "excitement" => 'キタ━━━━━━(゚∀゚)━━━━━━!!!!!',
35
- "n" => 'キタ━━━━━━(゚∀゚)━━━━━━!!!!!',
36
- "goofy" => '(゚∀゚)',
37
- "o" => '(゚∀゚)',
38
- "happy" => '( ゚ ヮ゚)',
39
- "p" => '( ゚ ヮ゚)',
40
- "heh" => '(´・∀・`)',
41
- "q" => '(´•∀•`)',
42
- "hooray" => '\(^o^)/',
43
- "r" => '\(^o^)/',
44
- "hugesurprise" => 'Σ(゚Д゚)',
45
- "s" => 'Σ(゚Д゚)',
46
- "impatience" => '(゚Д゚;≡;゚Д゚)',
47
- "t" => '(゚Д゚;≡;゚Д゚)',
48
- "indifferent" => '( ´_ゝ`)',
49
- "u" => '( ´_ゝ`)',
50
- "intuition" => 'm9(・∀・)',
51
- "v" => 'm9(・∀・)',
52
- "irritable" => 'ヽ(`Д´)ノ',
53
- "w" => 'ヽ(`Д´)ノ',
54
- "koi" => 'щ(゚Д゚щ)',
55
- "x" => 'щ(゚Д゚щ)',
56
- "korean" => '<`∀´>',
57
- "y" => '<`∀´>',
58
- "money" => '(・∀・)つ⑩',
59
- "z" => '(・∀・)つ⑩',
60
- "panting" => '( ´Д`)',
61
- "M" => '( ´Д`)',
62
- "peace" => 'ヽ(´ー`)ノ',
63
- "N" => 'ヽ(´ー`)ノ',
64
- "perky" => '(`・ω・´)',
65
- "O" => '(`・ω・´)',
66
- "sad" => '(´;ω;`)',
67
- "P" => '(´;ω;`)',
68
- "sarcasm" => '(・∀・)',
69
- "A" => '(・∀・)',
70
- "shocked" => 'Σ(゜д゜;)',
71
- "B" => 'Σ(゜д゜;)',
72
- "smoking" => '(´ー`)y-~~',
73
- "C" => '(´ー`)y-~~',
74
- "snorlax" => '( ̄ー ̄)',
75
- "D" => '( ̄ー ̄)',
76
- "spooked" => '(((( ;゚Д゚)))',
77
- "E" => '(((( ;゚Д゚)))',
78
- "stirring" => '(*´Д`)',
79
- "F" => '(*´Д`)',
80
- "supercilious" => 'm9(^Д^)',
81
- "G" => 'm9(^Д^)',
82
- "surprised" => '( ゚Д゚)',
83
- "H" => '( ゚Д゚)',
84
- "tfwnogf" => '(`A`)',
85
- "I" => '(`A`)',
86
- "thinking" => '(´-`).。oO',
87
- "J" => '(´-`).。oO',
88
- "unconvincing" => 'エェェ(´д`)ェェエ',
89
- "K" => 'エェェ(´д`)ェェエ',
90
- "unforeseen" => '(゚д゚)',
91
- "L" => '(゚д゚)',
92
- "_positive" => [0, 5, 13, 14, 15, 17, 37]
93
- }
94
- def positive_emote
95
- return $emote.values[$emote["_positive"][rand($emote["_positive"].length)]]
1
+ class Emote
2
+
3
+ def self.amazed
4
+ '( ゚д゚)'
5
+ end
6
+
7
+ def self.a
8
+ '( ゚д゚)'
9
+ end
10
+
11
+ def self.angry
12
+ '(#゚Д゚)'
13
+ end
14
+
15
+ def self.b
16
+ '(#゚Д゚)'
17
+ end
18
+
19
+ def self.bad
20
+ '(・A・)'
21
+ end
22
+
23
+ def self.c
24
+ '(・A・)'
25
+ end
26
+
27
+ def self.bowing
28
+ 'm(_ _)m'
29
+ end
30
+
31
+ def self.d
32
+ 'm(_ _)m'
33
+ end
34
+
35
+ def self.bun
36
+ '⊂二二二( ^ω^)二⊃'
37
+ end
38
+
39
+ def self.e
40
+ '⊂二二二( ^ω^)二⊃'
41
+ end
42
+
43
+ def self.carefree
44
+ '(´∀`)'
45
+ end
46
+
47
+ def self.f
48
+ '(´∀`)'
49
+ end
50
+
51
+ def self.chinese
52
+ '(`ハ´)'
53
+ end
54
+
55
+ def self.g
56
+ '(`ハ´)'
57
+ end
58
+
59
+ def self.crying
60
+ '( ´Д⊂ヽ'
61
+ end
62
+
63
+ def self.h
64
+ '(´Д⊂ヽ'
65
+ end
66
+
67
+ def self.deflagged
68
+ '[゚д゚]'
69
+ end
70
+
71
+ def self.i
72
+ '[゚д゚]'
73
+ end
74
+
75
+ def self.deflated
76
+ '(´・ω・`)'
77
+ end
78
+
79
+ def self.j
80
+ '(´・ω・`)'
81
+ end
82
+
83
+ def self.depressed
84
+ '( ´
85
+ end
86
+ _ゝ`)'
87
+ end
88
+
89
+ def self.k
90
+ '( ´
91
+ end
92
+ _ゝ`)'
93
+ end
94
+
95
+ def self.dontknow
96
+ '┐(`~`;)┌'
97
+ end
98
+
99
+ def self.l
100
+ '┐(`~`;)┌'
101
+ end
102
+
103
+ def self.evillaugh
104
+ '( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \'
105
+ end
106
+
107
+ def self.m
108
+ '( ゚∀゚)アハハ八八ノヽノヽノヽノ \ / \/ \'
109
+ end
110
+
111
+ def self.excitement
112
+ 'キタ━━━━━━(゚∀゚)━━━━━━!!!!!'
113
+ end
114
+
115
+ def self.n
116
+ 'キタ━━━━━━(゚∀゚)━━━━━━!!!!!'
117
+ end
118
+
119
+ def self.goofy
120
+ '(゚∀゚)'
121
+ end
122
+
123
+ def self.o
124
+ '(゚∀゚)'
125
+ end
126
+
127
+ def self.happy
128
+ '( ゚ ヮ゚)'
129
+ end
130
+
131
+ def self.p
132
+ '( ゚ ヮ゚)'
133
+ end
134
+
135
+ def self.heh
136
+ '(´・∀・`)'
137
+ end
138
+
139
+ def self.q
140
+ '(´•∀•`)'
141
+ end
142
+
143
+ def self.hooray
144
+ '\(^o^)/'
145
+ end
146
+
147
+ def self.r
148
+ '\(^o^)/'
149
+ end
150
+
151
+ def self.hugesurprise
152
+ 'Σ(゚Д゚)'
153
+ end
154
+
155
+ def self.s
156
+ 'Σ(゚Д゚)'
157
+ end
158
+
159
+ def self.impatience
160
+ '(゚Д゚;≡;゚Д゚)'
161
+ end
162
+
163
+ def self.t
164
+ '(゚Д゚;≡;゚Д゚)'
165
+ end
166
+
167
+ def self.indifferent
168
+ '( ´_ゝ`)'
169
+ end
170
+
171
+ def self.u
172
+ '( ´_ゝ`)'
173
+ end
174
+
175
+ def self.intuition
176
+ 'm9(・∀・)'
177
+ end
178
+
179
+ def self.v
180
+ 'm9(・∀・)'
181
+ end
182
+
183
+ def self.irritable
184
+ 'ヽ(`Д´)ノ'
185
+ end
186
+
187
+ def self.w
188
+ 'ヽ(`Д´)ノ'
189
+ end
190
+
191
+ def self.koi
192
+ 'щ(゚Д゚щ)'
193
+ end
194
+
195
+ def self.x
196
+ 'щ(゚Д゚щ)'
197
+ end
198
+
199
+ def self.korean
200
+ '<`∀´>'
201
+ end
202
+
203
+ def self.y
204
+ '<`∀´>'
205
+ end
206
+
207
+ def self.money
208
+ '(・∀・)つ⑩'
209
+ end
210
+
211
+ def self.z
212
+ '(・∀・)つ⑩'
213
+ end
214
+
215
+ def self.panting
216
+ '( ´Д`)'
217
+ end
218
+
219
+ def self.M
220
+ '( ´Д`)'
221
+ end
222
+
223
+ def self.peace
224
+ 'ヽ(´ー`)ノ'
225
+ end
226
+
227
+ def self.N
228
+ 'ヽ(´ー`)ノ'
229
+ end
230
+
231
+ def self.perky
232
+ '(`・ω・´)'
233
+ end
234
+
235
+ def self.O
236
+ '(`・ω・´)'
237
+ end
238
+
239
+ def self.sad
240
+ '(´;ω;`)'
241
+ end
242
+
243
+ def self.P
244
+ '(´;ω;`)'
245
+ end
246
+
247
+ def self.sarcasm
248
+ '(・∀・)'
249
+ end
250
+
251
+ def self.A
252
+ '(・∀・)'
253
+ end
254
+
255
+ def self.shocked
256
+ 'Σ(゜д゜;)'
257
+ end
258
+
259
+ def self.B
260
+ 'Σ(゜д゜;)'
261
+ end
262
+
263
+ def self.smoking
264
+ '(´ー`)y-~~'
265
+ end
266
+
267
+ def self.C
268
+ '(´ー`)y-~~'
269
+ end
270
+
271
+ def self.snorlax
272
+ '( ̄ー ̄)'
273
+ end
274
+
275
+ def self.D
276
+ '( ̄ー ̄)'
277
+ end
278
+
279
+ def self.spooked
280
+ '(((( ;゚Д゚)))'
281
+ end
282
+
283
+ def self.E
284
+ '(((( ;゚Д゚)))'
285
+ end
286
+
287
+ def self.stirring
288
+ '(*´Д`)'
289
+ end
290
+
291
+ def self.F
292
+ '(*´Д`)'
293
+ end
294
+
295
+ def self.supercilious
296
+ 'm9(^Д^)'
297
+ end
298
+
299
+ def self.G
300
+ 'm9(^Д^)'
301
+ end
302
+
303
+ def self.surprised
304
+ '( ゚Д゚)'
305
+ end
306
+
307
+ def self.H
308
+ '( ゚Д゚)'
309
+ end
310
+
311
+ def self.tfwnogf
312
+ '(`A`)'
313
+ end
314
+
315
+ def self.I
316
+ '(`A`)'
317
+ end
318
+
319
+ def self.thinking
320
+ '(´-`).。oO'
321
+ end
322
+
323
+ def self.J
324
+ '(´-`).。oO'
325
+ end
326
+
327
+ def self.unconvincing
328
+ 'エェェ(´д`)ェェエ'
329
+ end
330
+
331
+ def self.K
332
+ 'エェェ(´д`)ェェエ'
333
+ end
334
+
335
+ def self.unforeseen
336
+ '(゚д゚)'
337
+ end
338
+
339
+ def self.L
340
+ '(゚д゚)'
341
+ end
342
+
96
343
  end
97
344
 
345
+