Module: Termtter::Client

Defined in:
lib/plugins/train.rb,
lib/plugins/db.rb,
lib/plugins/hi.rb,
lib/plugins/l2.rb,
lib/plugins/me.rb,
lib/plugins/sl.rb,
lib/plugins/erb.rb,
lib/plugins/log.rb,
lib/plugins/say.rb,
lib/plugins/bomb.rb,
lib/plugins/cool.rb,
lib/plugins/open.rb,
lib/plugins/clear.rb,
lib/plugins/curry.rb,
lib/plugins/devel.rb,
lib/plugins/en2ja.rb,
lib/plugins/grass.rb,
lib/plugins/group.rb,
lib/plugins/shell.rb,
lib/plugins/timer.rb,
lib/plugins/wassr.rb,
lib/plugins/whois.rb,
lib/plugins/yhara.rb,
lib/plugins/yonda.rb,
lib/plugins/fibyou.rb,
lib/plugins/filter.rb,
lib/plugins/hatebu.rb,
lib/plugins/ignore.rb,
lib/plugins/irc_gw.rb,
lib/plugins/itunes.rb,
lib/plugins/otsune.rb,
lib/plugins/otsune.rb,
lib/plugins/primes.rb,
lib/plugins/random.rb,
lib/plugins/reblog.rb,
lib/plugins/scrape.rb,
lib/plugins/trends.rb,
lib/plugins/history.rb,
lib/plugins/jakigan.rb,
lib/plugins/outputz.rb,
lib/plugins/replace.rb,
lib/plugins/reverse.rb,
lib/plugins/storage.rb,
lib/plugins/twitpic.rb,
lib/termtter/client.rb,
lib/plugins/addspace.rb,
lib/plugins/countter.rb,
lib/plugins/defaults.rb,
lib/plugins/open_url.rb,
lib/plugins/paranoid.rb,
lib/plugins/saykanji.rb,
lib/plugins/uri-open.rb,
lib/plugins/quicklook.rb,
lib/plugins/fib_filter.rb,
lib/plugins/multi_post.rb,
lib/plugins/quick_exit.rb,
lib/plugins/search_url.rb,
lib/plugins/searchline.rb,
lib/plugins/typable_id.rb,
lib/plugins/http_server.rb,
lib/plugins/multi_reply.rb,
lib/plugins/switch_user.rb,
lib/plugins/command_plus.rb,
lib/plugins/command_plus.rb,
lib/plugins/multi_output.rb,
lib/plugins/multi_output.rb,
lib/plugins/defaults/exec.rb,
lib/plugins/github-issues.rb,
lib/plugins/screen-notify.rb,
lib/plugins/system_status.rb,
lib/plugins/update_editor.rb,
lib/plugins/defaults/alias.rb,
lib/plugins/list_with_opts.rb,
lib/plugins/defaults/stdout.rb,
lib/plugins/defaults/retweet.rb,
lib/plugins/hatebu_and_update.rb,
lib/plugins/defaults/auto_reload.rb,
lib/plugins/defaults/standard_commands.rb,
lib/plugins/defaults/standard_completion.rb

Overview

config.plugins.alias.aliases = { :e => ‘exit’, :q => ‘exit’}

Defined Under Namespace

Modules: Jakigan Classes: SearchEvent

Constant Summary collapse

SEARCH_URI =
'search.twitter.com'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.commandsObject (readonly)

Returns the value of attribute commands.



27
28
29
# File 'lib/termtter/client.rb', line 27

def commands
  @commands
end

.hooksObject (readonly)

Returns the value of attribute hooks.



27
28
29
# File 'lib/termtter/client.rb', line 27

def hooks
  @hooks
end

Class Method Details

.add_command(name) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/termtter/client.rb', line 101

def add_command(name)
  if block_given?
    command = Command.new(:name => name)
    yield command
    @commands[command.name] = command
  else
    raise ArgumentError, 'must be given block to set parameters'
  end
end

.add_filter(&b) ⇒ Object



47
48
49
50
# File 'lib/termtter/client.rb', line 47

def add_filter(&b)
  warn "add_filter method will be removed. Use Termtter::Client.register_hook(:name => ..., :point => :filter_for_output, :exec => ... ) instead."
  @filters << b
end

.add_task(*arg, &block) ⇒ Object



225
226
227
# File 'lib/termtter/client.rb', line 225

def add_task(*arg, &block)
  @task_manager.add_task(*arg, &block)
end

.alias_command(arg) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/plugins/command_plus.rb', line 12

def alias_command(arg)
  original, new = arg.split(/\s+/)
  if @commands[original.to_sym]
    @commands[new.to_sym] = @commands[original.to_sym].clone
    @commands[new.to_sym].name    = new.to_sym
    @commands[new.to_sym].aliases = []
    @commands[new.to_sym].help    = ''
    puts "alias '#{original}' to '#{new}'."
  else
    raise "#{original} command is not found."
  end
end

.apply_filters_for_hook(hook_name, statuses, event) ⇒ Object



160
161
162
163
164
# File 'lib/termtter/client.rb', line 160

def apply_filters_for_hook(hook_name, statuses, event)
  get_hooks(hook_name).inject(statuses) {|s, hook|
    hook.call(s, event)
  }
end

.call_commands(text) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/termtter/client.rb', line 176

def call_commands(text)
  @task_manager.invoke_and_wait do
    # FIXME: This block can become Maybe Monad
    get_hooks("pre_command").each {|hook|
      break if text == nil # interrupt if hook returns nil
      text = hook.call(text)
    }
    return if text.empty?

    commands = find_commands(text)
    raise CommandNotFound, text if commands.empty?

    commands.each do |command|
      command_str, command_arg = Command.split_command_line(text)

      modified_arg = command_arg
      # FIXME: This block can become Maybe Monad
      get_hooks("modify_arg_for_#{command.name.to_s}").each {|hook|
        break if modified_arg == false # interrupt if hook return false
        modified_arg = hook.call(command_str, modified_arg)
      }

      begin
        call_hooks("pre_exec_#{command.name.to_s}", command, modified_arg)
        result = command.call(command_str, modified_arg, text) # exec command
        call_hooks("post_exec_#{command.name.to_s}", command_str, modified_arg, result)
      rescue CommandCanceled
      end
    end
    call_hooks("post_command", text)
  end
end

.call_hooks(point, *args) ⇒ Object

return last hook return value



167
168
169
170
171
172
173
174
# File 'lib/termtter/client.rb', line 167

def call_hooks(point, *args)
  result = nil
  get_hooks(point).each {|hook|
    break if result == false # interrupt if hook return false
    result = hook.call(*args)
  }
  result
end

.clear_commandObject



111
112
113
# File 'lib/termtter/client.rb', line 111

def clear_command
  @commands.clear
end

.clear_filterObject



52
53
54
# File 'lib/termtter/client.rb', line 52

def clear_filter
  @filters.clear
end

.command_exists?(text) ⇒ Boolean

Returns:

  • (Boolean)


209
210
211
# File 'lib/termtter/client.rb', line 209

def command_exists?(text)
  @commands.values.any? {|command| command.match?(text) }
end

.confirm(message, default_yes = true, &block) ⇒ Object



345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/termtter/client.rb', line 345

def confirm(message, default_yes = true, &block)
  pause # TODO: TaskManager から呼ばれるならこれいらないなぁ

  prompt =
    if default_yes
      "\"#{message}".strip + "\" [Y/n] "
    else
      "\"#{message}".strip + "\" [N/y] "
    end
  result = !!(/^y?$/i =~ Readline.readline(prompt, false))

  if result && block
    block.call
  end

  result
ensure
  resume # TODO: TaskManager から呼ばれるならこれいらないなぁ
end

.data_to_typable_id(data) ⇒ Object



56
57
58
# File 'lib/plugins/defaults/stdout.rb', line 56

def self.data_to_typable_id(data)
  id = config.plugins.stdout.typable_id_prefix + @typable_id_generator.get_id(data)
end

.default_loggerObject



271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/termtter/client.rb', line 271

def default_logger
  logger = Logger.new(STDOUT)
  logger.formatter = lambda {|severity, time, progname, message|
    color =
      case severity
      when /^DEBUG/
        'blue'
      when /^INFO/
        'cyan'
      when /^WARN/
        'magenta'
      when /^ERROR/
        'red'
      when /^FATAL/
        'on_red'
      else
        'white'
      end
    TermColor.parse("<#{color}>" + TermColor.escape("[#{severity}] #{message}\n") + "</#{color}>")
  }
  logger
end

.delete_and_replace(recent, pattern_reg, replace, global) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/plugins/replace.rb', line 4

def self.delete_and_replace(recent, pattern_reg, replace, global)
  new_text =
    if global
      recent.text.gsub(pattern_reg, replace)
    else
      recent.text.sub(pattern_reg, replace)
    end

  param =
    if recent.in_reply_to_status_id
      {:in_reply_to_status_id => recent.in_reply_to_status_id}
    else
      {}
    end

  if new_text == recent.text
    puts "It was not replaced."
    raise Termtter::CommandCanceled
  end

  if /^y?$/i !~ Readline.readline("\"replace #{new_text}\" [Y/n] ", false)
    puts 'canceled.'
    raise Termtter::CommandCanceled
  else
    result = Termtter::API.twitter.remove_status(recent.id)
    puts "deleted => #{result.text}"
    result = Termtter::API.twitter.update(new_text, param)
    puts "updated => #{result.text}"
  end
end

.delete_command(arg) ⇒ Object



4
5
6
7
8
9
10
# File 'lib/plugins/command_plus.rb', line 4

def delete_command(arg)
  if @commands.delete(arg.to_sym)
    puts "#{arg} command is deleted."
  else
    raise "#{arg} command is not found."
  end
end

.delete_output(name) ⇒ Object



10
11
12
# File 'lib/plugins/multi_output.rb', line 10

def delete_output(name)
  @outputs.delete(name)
end

.delete_task(key) ⇒ Object



7
8
9
# File 'lib/plugins/searchline.rb', line 7

def delete_task(key)
  @task_manager.delete_task(key) # returns nil if task for key is not exist
end

.english?(text) ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
# File 'lib/plugins/en2ja.rb', line 14

def self.english?(text)
  /[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/ !~ text
end

.eval_init_blockObject



304
305
306
# File 'lib/termtter/client.rb', line 304

def eval_init_block
  @init_block.call(self) if @init_block
end

.exitObject



229
230
231
232
233
# File 'lib/termtter/client.rb', line 229

def exit
  puts 'finalizing...'
  call_hooks(:exit)
  @task_manager.kill
end

.find_commands(text) ⇒ Object



213
214
215
# File 'lib/termtter/client.rb', line 213

def find_commands(text)
  @commands.values.select {|command| command.match?(text) }
end

.find_filter_candidates(a, b, filters) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/plugins/filter.rb', line 49

def self.find_filter_candidates(a, b, filters)
  if a.empty?
    filters.to_a
  else
    filters.grep(/^#{Regexp.quote a}/i)
  end.
  map {|u| b % u }
end

.find_group_candidates(a, b) ⇒ Object



9
10
11
12
13
# File 'lib/plugins/group.rb', line 9

def self.find_group_candidates(a, b)
  config.plugins.group.groups.keys.map {|k| k.to_s}.
    grep(/^#{Regexp.quote a}/).
    map {|u| b % u }
end

.find_status_ids(text) ⇒ Object



494
495
496
# File 'lib/plugins/defaults/standard_commands.rb', line 494

def self.find_status_ids(text)
  public_storage[:status_ids].select {|id| /#{Regexp.quote(text)}/ =~ id.to_s}
end

.find_users(text) ⇒ Object



498
499
500
# File 'lib/plugins/defaults/standard_commands.rb', line 498

def self.find_users(text)
  public_storage[:users].select {|user| /^#{Regexp.quote(text)}/ =~ user}
end

.formatted_help(helps) ⇒ Object



369
370
371
372
373
374
375
376
# File 'lib/plugins/defaults/standard_commands.rb', line 369

def self.formatted_help(helps)
  helps = helps.sort_by {|help| help[0] }
  width = helps.map {|n, _| n.size }.max
  space = 3
  helps.map {|name, desc|
    name.to_s.ljust(width + space) + desc.to_s
  }.join("\n")
end

.friendsObject



11
12
13
14
15
16
17
18
19
20
# File 'lib/plugins/irc_gw.rb', line 11

def friends
  user_name = config.user_name

  frinends = []
  page = 0
  begin
    frinends += tmp = Termtter::API::twitter.friends(user_name, :page => page+=1)
  end until tmp.empty?
  frinends.map(&:screen_name)
end

.get_command(name) ⇒ Object



115
116
117
# File 'lib/termtter/client.rb', line 115

def get_command(name)
  @commands[name]
end

.get_group_of(screen_name) ⇒ Object



15
16
17
# File 'lib/plugins/group.rb', line 15

def self.get_group_of(screen_name)
  config.plugins.group.groups.select{ |k, v| v.include? screen_name}.map{|a| a.first}
end

.get_hook(name) ⇒ Object



73
74
75
# File 'lib/termtter/client.rb', line 73

def get_hook(name)
  @hooks[name]
end

.get_hooks(point) ⇒ Object



77
78
79
80
81
82
# File 'lib/termtter/client.rb', line 77

def get_hooks(point)
  # TODO: sort by alphabet
  @hooks.values.select do |hook|
    hook.match?(point)
  end
end

.handle_error(e) ⇒ Object



332
333
334
335
336
337
338
339
340
341
342
343
# File 'lib/termtter/client.rb', line 332

def handle_error(e)
  if logger
    logger.error("#{e.class.to_s}: #{e.message}")
    logger.error(e.backtrace.join("\n")) if config.devel
  else
    raise e
  end
  get_hooks(:on_error).each {|hook| hook.call(e) }
rescue Exception => e
  puts "Error: #{e}"
  puts e.backtrace.join("\n")
end

.init(&block) ⇒ Object



294
295
296
# File 'lib/termtter/client.rb', line 294

def init(&block)
  @init_block = block
end

.input_editorObject



180
181
182
183
184
185
186
187
188
189
190
# File 'lib/plugins/github-issues.rb', line 180

def self.input_editor(body = nil)
  file = Tempfile.new('termtter')
  editor = config.plugins.github_issues.editor
  file.write body if body
  file.close
  system("#{editor} #{file.path}")
  result = file.open.read
  file.flush
  file.close(false)
  result
end

.is_member?(status, group = nil) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
59
60
61
62
# File 'lib/plugins/group.rb', line 56

def self.is_member?(status, group = nil)
  if group
    config.plugins.group.groups[group].include? status.user.screen_name
  else
    config.plugins.group.groups.values.flatten.include? status.user.screen_name
  end
end

.legacy_config_supportObject



244
245
246
247
248
249
250
251
# File 'lib/termtter/client.rb', line 244

def legacy_config_support
  case File.ftype(File.expand_path('~/.termtter'))
  when 'directory'
    # nop
  when 'file'
    move_legacy_config_file
  end
end

.load_configObject



235
236
237
238
239
240
241
242
# File 'lib/termtter/client.rb', line 235

def load_config
  legacy_config_support() if File.exist? Termtter::CONF_DIR
  unless File.exist?(Termtter::CONF_FILE)
    require 'termtter/config_setup'
    ConfigSetup.run
  end
  load Termtter::CONF_FILE
end

.load_historyObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/plugins/history.rb', line 17

def self.load_history
  filename = File.expand_path(config.plugins.history.filename)
  keys = config.plugins.history.keys

  if File.exist?(filename)
    begin
      history = Marshal.load Zlib::Inflate.inflate(File.read(filename))
    end
    if history
      keys.each do |key|
        public_storage[key] = history[key] if history[key]
      end
      Readline::HISTORY.push *history[:history] if history[:history]
      puts "history loaded(#{File.size(filename)/1000}kb)"
    end
  end
end

.load_pluginsObject



298
299
300
301
302
# File 'lib/termtter/client.rb', line 298

def load_plugins
  plug 'defaults'
  plug 'devel' if config.devel
  plug config.system.load_plugins
end

.loggerObject



263
264
265
# File 'lib/termtter/client.rb', line 263

def logger
  @logger
end

.move_legacy_config_fileObject



253
254
255
256
257
258
259
260
261
# File 'lib/termtter/client.rb', line 253

def move_legacy_config_file
  FileUtils.mv(
    Termtter::CONF_DIR,
    File.expand_path('~/.termtter___'))
  Dir.mkdir(Termtter::CONF_DIR)
  FileUtils.mv(
    File.expand_path('~/.termtter___'),
    Termtter::CONF_FILE)
end

.normalize_as_user_name(text) ⇒ Object



490
491
492
# File 'lib/plugins/defaults/standard_commands.rb', line 490

def self.normalize_as_user_name(text)
  text.strip.sub(/^@/, '')
end

.open_uri(uri) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/plugins/open_url.rb', line 6

def self.open_uri(uri)
  unless config.plugins.open_url.browser.empty?
    system config.plugins.open_url.browser, uri
  else
    case RUBY_PLATFORM
    when /linux/
      system 'firefox', uri
    when /mswin(?!ce)|mingw|bccwin/
      system 'explorer', uri
    else
      system 'open', uri
    end
  end
end

.output(statuses, event) ⇒ Object

statuses => [status, status, …] status => {

  :id => status id,
  :created_at => created time,
  :user_id => user id,
  :name => user name,
  :screen_name => user screen_name,
  :source => source,
  :reply_to => reply_to status id,
  :text => status,
  :original_data => original data,
}


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/termtter/client.rb', line 139

def output(statuses, event)
  return if statuses.nil? || statuses.empty?

  statuses = statuses.sort_by(&:id)
  call_hooks(:pre_filter, statuses, event)

  filtered = apply_filters_for_hook(:filter_for_output, statuses.map(&:clone), event)

  @filters.each do |f|  # TODO: code for compatibility. delete someday.
    filtered = f.call(filtered, event)
  end

  call_hooks(:post_filter, filtered, event)
  get_hooks(:output).each do |hook|
    hook.call(
      apply_filters_for_hook("filter_for_#{hook.name}", filtered, event),
      event
    )
  end
end

.pauseObject



217
218
219
# File 'lib/termtter/client.rb', line 217

def pause
  @task_manager.pause
end

.plug(name, options = {}) ⇒ Object

plug

Name -> (Hash) -> IO () where NAME = String | Symbol | [NAME]



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/termtter/client.rb', line 30

def plug(name, options = {})
  if Array === name # Obviously `name.respond_to?(:each)` is better, but for 1.8.6 compatibility we cannot.
    name.each {|i| plug(i, options) }
    return
  end
  options.each do |key, value|
    config.plugins.__refer__(name.gsub(/-/, '_').to_sym).__assign__(key.to_sym, value)
  end
  load "plugins/#{name}.rb"
rescue Exception => e
  Termtter::Client.handle_error(e)
end

.plugin_listObject

plugin_list

IO ()



400
401
402
403
404
405
406
407
408
409
410
411
# File 'lib/plugins/defaults/standard_commands.rb', line 400

def self.plugin_list
  plugin_list = (Dir["#{File.dirname(__FILE__)}/../*.rb"] + Dir["#{Termtter::CONF_DIR}/plugins/*.rb"]).
    map {|f| File.basename(f).sub(/\.rb$/, '')}.
    sort
  list = plugin_list
  width = list.map {|i|i.size}.max + 2
  a = []
  list.sort.each_slice(4) {|i|
    a << i.map {|j| j + (" " * (width - j.size))}.join
  }
  puts TermColor.parse('<green>' + TermColor.escape(a.join("\n")) + '</green>')
end

.post_retweet(s, comment = nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/plugins/defaults/retweet.rb', line 6

def self.post_retweet(s, comment = nil)
  if s.user.protected &&
      !confirm("#{s.user.screen_name} is protected! Are you sure?", false)
    return
  end

  comment += ' ' unless comment.nil?
  text = ERB.new(config.plugins.retweet.format).result(binding)
  Termtter::API.twitter.update(text)
  puts "=> #{text}"

  return text
end

.public_storageObject



43
44
45
# File 'lib/termtter/client.rb', line 43

def public_storage
  @public_storage ||= {}
end

.puts(message) ⇒ Object



14
15
16
17
18
# File 'lib/plugins/multi_output.rb', line 14

def puts message
  @outputs.each_value do |block|
    block.call(message)
  end
end

.register_alias(alias_name, command) ⇒ Object Also known as: alias



24
25
26
# File 'lib/plugins/defaults/alias.rb', line 24

def register_alias(alias_name, command)
  @aliases[alias_name.to_sym] = command.to_s
end

.register_command(arg, opts = {}, &block) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/termtter/client.rb', line 84

def register_command(arg, opts = {}, &block)
  command = case arg
    when Command
      arg
    when Hash
      Command.new(arg)
    when String, Symbol
      options = { :name => arg }
      options.merge!(opts)
      options[:exec_proc] = block
      Command.new(options)
    else
      raise ArgumentError, 'must be given Termtter::Command, Hash or String(Symbol) with block'
    end
  @commands[command.name] = command
end

.register_hook(arg, opts = {}, &block) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/termtter/client.rb', line 56

def register_hook(arg, opts = {}, &block)
  hook = case arg
    when Hook
      arg
    when Hash
      Hook.new(arg)
    when String, Symbol
      options = { :name => arg }
      options.merge!(opts)
      options[:exec_proc] = block
      Hook.new(options)
    else
      raise ArgumentError, 'must be given Termtter::Hook, Hash, String or Symbol'
    end
  @hooks[hook.name] = hook
end

.register_macro(name, macro, options = {}) ⇒ Object



119
120
121
122
123
124
125
# File 'lib/termtter/client.rb', line 119

def register_macro(name, macro, options = {})
  command = {
    :name => name.to_sym,
    :exec_proc => lambda {|arg| call_commands(macro % arg)}
  }.merge(options)
  register_command(command)
end

.register_output(as, &block) ⇒ Object



6
7
8
# File 'lib/plugins/multi_output.rb', line 6

def register_output(as, &block)
  @outputs[as] = block
end

.remove_alias(alias_name) ⇒ Object



29
30
31
# File 'lib/plugins/defaults/alias.rb', line 29

def remove_alias(alias_name)
  @aliases.delete alias_name.to_sym
end

.resumeObject



221
222
223
# File 'lib/termtter/client.rb', line 221

def resume
  @task_manager.resume
end

.runObject



308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/termtter/client.rb', line 308

def run
  load_config()
  Termtter::API.setup()
  setup_logger()
  load_plugins()
  eval_init_block()

  config.system.eval_scripts.each do |script|
    begin
      eval script
    rescue Exception => e
      handle_error(e)
    end
  end

  config.system.run_commands.each {|cmd| call_commands(cmd) }

  unless config.system.cmd_mode
    @task_manager.run()
    call_hooks(:initialize)
    call_hooks(:launched)
  end
end

.save_historyObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/plugins/history.rb', line 35

def self.save_history
  filename = File.expand_path(config.plugins.history.filename)
  keys = config.plugins.history.keys
  history = { }
  keys.each do |key|
    history[key] = public_storage[key]
  end
  max_of_history = config.plugins.history.max_of_history
  history[:history] = Readline::HISTORY.to_a.reverse.uniq.reverse
  if history[:history].size > max_of_history
    history[:history] = history[:history][-max_of_history..-1]
  end

  File.open(filename, 'w') do |f|
    f.write Zlib::Deflate.deflate(Marshal.dump(history))
  end
  puts "history saved(#{File.size(filename)/1000}kb)"
end

.scrape_group(group) ⇒ Object



14
15
16
17
# File 'lib/plugins/scrape.rb', line 14

def self.scrape_group(group)
  members = config.plugins.group.groups[group] || []
  scrape_members(members)
end

.scrape_members(members) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/plugins/scrape.rb', line 5

def self.scrape_members(members)
  statuses = []
  members.each_with_index do |member, index|
    puts "member #{index+1}/#{members.size} #{member}"
    statuses += Termtter::API.twitter.user_timeline(member)
  end
  statuses
end

.setup_loggerObject



267
268
269
# File 'lib/termtter/client.rb', line 267

def setup_logger
  @logger = config.logger || default_logger
end

.show_settings(conf, level = 0) ⇒ Object



290
291
292
293
294
295
296
297
298
299
300
# File 'lib/plugins/defaults/standard_commands.rb', line 290

def self.show_settings(conf, level = 0)
  conf.__values__.each do |k, v|
    if v.instance_of? Termtter::Config
      puts "#{k}:"
      show_settings v, level + 1
    else
      print '  ' * level
      puts "#{k} = #{v.nil? ? 'nil' : v.inspect}"
    end
  end
end

.time_format_for(statuses) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/plugins/defaults/stdout.rb', line 64

def self.time_format_for(statuses)
  t0 = Time.now
  t1 = Time.parse(statuses.first[:created_at])
  t2 = Time.parse(statuses.last[:created_at])
  if [t0.year, t0.month, t0.day] == [t1.year, t1.month, t1.day] \
    and [t1.year, t1.month, t1.day] == [t2.year, t2.month, t2.day]
    config.plugins.stdout.time_format_today
  else
    config.plugins.stdout.time_format_not_today
  end
end

.train(length) ⇒ Object



4
5
6
7
8
# File 'lib/plugins/train.rb', line 4

def self.train(length)
  text = "ε="
  length.times{ text << "⋤⋥" }
  text
end

.typable_id?(id) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
64
# File 'lib/plugins/typable_id.rb', line 58

def self.typable_id?(id)
  if public_storage[:typable_id].assoc(id.to_s)
    return true
  else
    return false
  end
end

.typable_id_convert(id) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'lib/plugins/typable_id.rb', line 39

def self.typable_id_convert(id)
  if current_id = public_storage[:typable_id].assoc(id.to_s)
    return current_id[1]
  elsif current_id = public_storage[:typable_id].rassoc(id.to_s)
    return current_id[0]
  else
    return nil
  end
end

.typable_id_status(id) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/plugins/typable_id.rb', line 49

def self.typable_id_status(id)
  if current_id = (public_storage[:typable_id].assoc(id.to_s)||\
                   public_storage[:typable_id].rassoc(id.to_s))
    return current_id[2]
  else
    return nil
  end
end

.typable_id_to_data(id) ⇒ Object



60
61
62
# File 'lib/plugins/defaults/stdout.rb', line 60

def self.typable_id_to_data(id)
  @typable_id_generator.get(id)
end

.update_with_user_and_id(text, username, id) ⇒ Object



484
485
486
487
488
# File 'lib/plugins/defaults/standard_commands.rb', line 484

def self.update_with_user_and_id(text, username, id)
  text = "@#{username} #{text}"
  result = Termtter::API.twitter.update(text, {'in_reply_to_status_id' => id})
  puts "replied => #{result.text}"
end

.wassr_update(text) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/plugins/multi_post.rb', line 5

def wassr_update(text)
  if text.match(/^(\d+)\s+(.+)$/) and
      (s = Termtter::API.twitter.show($1) rescue nil)
    tmp_text = "@#{s.user.screen_name} #{$2}"
  else
    tmp_text = text
  end

  Net::HTTP.version_1_2
  req = Net::HTTP::Post.new("/statuses/update.json?")
  req.basic_auth config.plugins.wassr.username, config.plugins.wassr.password
  Net::HTTP.start('api.wassr.jp', 80) do |http|
    res = http.request(req, "status=#{URI.escape(tmp_text)}&source=Termtter")
  end
end