]>
Commit | Line | Data |
---|---|---|
685e346e A |
1 | RG_NO = 0x1\r |
2 | ARG_YES = 0x2\r | |
3 | ARG_OPT = 0x4\r | |
4 | ARG_OFFLINE = 0x8\r | |
5 | ARG_OFFLINE_REQ = 0x10\r | |
6 | \r | |
7 | class CommandManager(object):\r | |
8 | def __init__(self):\r | |
9 | self.prefix = self.get_prefix()\r | |
10 | self.invalid = self.get_invalid()\r | |
11 | self.commands = self.get_commands()\r | |
12 | self.generate_help()\r | |
13 | \r | |
14 | def get_prefix(self):\r | |
15 | return ''\r | |
16 | \r | |
17 | def get_invalid(self):\r | |
18 | return ''\r | |
19 | \r | |
20 | def get_commands(self):\r | |
21 | return {}\r | |
22 | \r | |
23 | def get_command(self, command):\r | |
24 | command = command.lower()\r | |
25 | \r | |
26 | if not command.startswith(self.prefix):\r | |
27 | return None\r | |
28 | \r | |
29 | command = command[len(self.prefix):]\r | |
30 | \r | |
31 | if not command in self.commands:\r | |
32 | return None\r | |
33 | \r | |
34 | command = self.commands[command]\r | |
35 | \r | |
36 | if not isinstance(command, basestring):\r | |
37 | return command\r | |
38 | \r | |
39 | command = command.lower()\r | |
40 | \r | |
41 | if not command in self.commands:\r | |
42 | return None\r | |
43 | \r | |
44 | return self.commands[command]\r | |
45 | \r | |
46 | def get_help(self, command = None):\r | |
47 | if command == None:\r | |
48 | return self.help\r | |
49 | else:\r | |
50 | if command.startswith(self.prefix):\r | |
51 | command = command[len(self.prefix):]\r | |
52 | \r | |
53 | if command in self.help_command:\r | |
54 | return self.help_command[command]\r | |
55 | \r | |
56 | return None\r | |
57 | \r | |
58 | def add_help_command(self, command):\r | |
59 | cmd = self.commands[command]\r | |
60 | \r | |
61 | if isinstance(cmd, basestring):\r | |
62 | cmd = self.commands[cmd]\r | |
63 | \r | |
64 | message = []\r | |
65 | \r | |
66 | cmd_type = cmd[1]\r | |
67 | cmd_desc = cmd[2]\r | |
68 | cmd_args = cmd[3]\r | |
69 | \r | |
70 | message.append('@b%s%s: %s' % (self.prefix, command, cmd_desc))\r | |
71 | message.append(' ')\r | |
72 | \r | |
73 | msg = 'Usage: @b%s%s@b' % (self.prefix, command)\r | |
74 | \r | |
75 | if len(cmd_args) > 0:\r | |
76 | msg += ' ' + ' '.join(['[%s%s]' % (cmd_arg[1], (' ' + cmd_arg[0]) if ('action' not in cmd_arg[3] or cmd_arg[3]['action'] != 'store_true') else '') for cmd_arg in cmd_args])\r | |
77 | \r | |
78 | if len(cmd) > 4:\r | |
79 | argument_name = cmd[4]\r | |
80 | else:\r | |
81 | argument_name = 'argument'\r | |
82 | \r | |
83 | if cmd_type & ARG_YES:\r | |
84 | msg += ' %s' % argument_name\r | |
85 | elif cmd_type & ARG_OPT:\r | |
86 | msg += ' [%s]' % argument_name\r | |
87 | \r | |
88 | message.append(msg)\r | |
89 | message.append('')\r | |
90 | \r | |
91 | longest = 0\r | |
92 | \r | |
93 | for cmd_arg in cmd_args:\r | |
94 | longest = len(cmd_arg[0]) if len(cmd_arg[0]) > longest else longest\r | |
95 | \r | |
96 | for cmd_arg in cmd_args:\r | |
97 | message.append('@b--%-*s (%s)@b %s' % (longest + 1, cmd_arg[0], cmd_arg[1], cmd_arg[2]))\r | |
98 | \r | |
99 | self.help_command[command] = message\r | |
100 | \r | |
101 | \r | |
102 | def generate_help(self):\r | |
103 | self.help = []\r | |
104 | \r | |
105 | self.help.append('@bCommands@b (type @b%shelp command name@b for detailed information):' % self.prefix)\r | |
106 | self.help.append(' ')\r | |
107 | \r | |
108 | longest = 0\r | |
109 | alias_dict = {}\r | |
110 | commands = {}\r | |
111 | \r | |
112 | for cmd in self.commands:\r | |
113 | if isinstance(self.commands[cmd], basestring):\r | |
114 | orig = self.commands[cmd]\r | |
115 | \r | |
116 | if orig in alias_dict:\r | |
117 | alias_dict[orig].append(cmd)\r | |
118 | else:\r | |
119 | alias_dict[orig] = [cmd]\r | |
120 | else:\r | |
121 | if not cmd in alias_dict:\r | |
122 | alias_dict[cmd] = []\r | |
123 | \r | |
124 | for key in alias_dict:\r | |
125 | cur = key + ('' if len(alias_dict[key]) == 0 else (' (' + ', '.join(alias_dict[key]) + ')'))\r | |
126 | longest = len(cur) if len(cur) > longest else longest\r | |
127 | commands[cur] = self.commands[key][2]\r | |
128 | \r | |
129 | for cmd in sorted(commands):\r | |
130 | self.help.append('@b%-*s@b %s' % (longest + 1, cmd, commands[cmd]))\r | |
131 | \r | |
132 | self.help_command = {}\r | |
133 | \r | |
134 | for command in self.commands:\r | |
135 | self.add_help_command(command)\r |