summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/tcllib/chatwidget.rb
blob: 860b9e899bff8f2830515d3396af495437667036 (plain)
1
2
3
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#
#  tkextlib/tcllib/chatwidget.rb
#                               by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
#   * Part of tcllib extension
#   * chatwidget - Provides a multi-paned view suitable for display of 
#                  chat room or irc channel information
#

require 'tk'
require 'tkextlib/tcllib.rb'

# TkPackage.require('chatwidget', '1.1.0')
TkPackage.require('chatwidget')

module Tk::Tcllib
  class ChatWidget < TkText
    PACKAGE_NAME = 'chatwidget'.freeze
    def self.package_name
      PACKAGE_NAME
    end

    def self.package_version
      begin
        TkPackage.require('chatwidget')
      rescue
        ''
      end
    end
  end
end

class Tk::Tcllib::ChatWidget
  TkCommandNames = ['::chatwidget::chatwidget'.freeze].freeze

  def show_topic
    tk_send_without_enc('topic', 'show')
    self
  end

  def hide_topic
    tk_send_without_enc('topic', 'hide')
    self
  end

  def set_topic(topic)
    tk_send('topic', 'set', topic)
  end

  def list_name
    tk_split_simplelist(tk_send('name', 'list'))
  end

  def list_name_full
    tk_split_simplelist(tk_send('name', 'list')).map{|lst|
      nick, *opts = tk_split_simplelist(lst)
      h_opt = {}
      opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)}
      [nick, h_opt]
    }
  end

  def add_name(nick, opts={})
    tk_send('name', 'add', nick, *(hash_kv(opts)))
  end

  def delete_name(nick)
    tk_send('name', 'delete', nick)
  end

  def get_name(nick)
    lst = tk_send('name', 'get', nick)
    return nil if lst.empty?
    nick, *opts = tk_split_simplelist(lst)
    h_opt = {}
    opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)}
    [nick, h_opt]
  end

  def message(msg, opts={})
    tk_send('message', msg, *(hash_kv(opts)))
    self
  end

  def _parse_hook_list(lst)
    tk_split_simplelist(lst).map{|hook|
      cmd, prior = tk_split_simplelist(hook)
      [procedure(cmd), number(prior)]
    }
  end
  private :_parse_hook_list

  def hook_add(type, *args, &blk) # args -> [prior, cmd], [prior], [cmd]
    #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
    
    if prior = args.shift
      if !prior.kind_of?(Numeric)
        cmd = prior
        if (prior = args.shift) && !prior.kind_of?(Numeric)  # error
          args.unshift(prior)
        end
        args.unshift(cmd)
      end
      prior ||= 50  # default priority
    end

    cmd = args.shift || blk

    fail ArgumentError, "invalid arguments" unless args.empty?
    fail ArgumentError, "no callback is given" unless cmd

    _parse_hook_list(tk_send('hook', 'add', type, cmd, prior))
  end

  def hook_remove(type, cmd)
    #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
    _parse_hook_list(tk_send('hook', 'remove', type, cmd))
  end

  def hook_run(type, *cmd_args)
    #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
    tk_send('hook', 'run', type, *cmd_args)
  end

  def hook_list(type)
    #type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
    _parse_hook_list(tk_send('hook', 'list', type))
  end

  def show_names
    tk_send('names', 'show')
    self
  end

  def hide_names
    tk_send('names', 'hide')
    self
  end

  def names_widget
    window(tk_send('names'))
  end

  def entry_widget
    window(tk_send('entry'))
  end

  def chat_widget
    window(tk_send('chat'))
  end
end