commandorobo 0.0.2
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 +7 -0
- data/lib/commandorobo.rb +211 -0
- data/lib/constants.rb +34 -0
- data/lib/util.rb +61 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3c1b24d072f07081dfdb1df6ab18501fa4530cca6162e95e0106a3eaac9bf26c
|
4
|
+
data.tar.gz: 20e5d0e5d5accd3f4287d88edb8d46169aea27beb98ec74cc79de43d441b33b6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 54ceee9db695de74bff50d97b5f478b1032b64b4feda0e23434b446c8bd1254c1454698469e1204995a9de9a0bc31646d217eb24895aef36e52ff44965384653
|
7
|
+
data.tar.gz: cb7ac9cf4cd91924668dba2792bc90f0709c8a71fceb754256e2fd115dd5fc0051cd4bf1cf3558e3d1387cbb55fc766cc801aabf18c9b67ab8026f8915ff73c2
|
data/lib/commandorobo.rb
ADDED
@@ -0,0 +1,211 @@
|
|
1
|
+
# Commandorobo
|
2
|
+
# written by ry00001 and Team ruborobo (ry00001, Erisa Arrowsmith (Seriel))
|
3
|
+
# Originally used for ruborobo (https://github.com/ry00001/ruborobo)
|
4
|
+
|
5
|
+
require 'discordrb'
|
6
|
+
require_relative './constants.rb'
|
7
|
+
require_relative './util.rb'
|
8
|
+
|
9
|
+
module Commandorobo
|
10
|
+
include Constants
|
11
|
+
include Utils
|
12
|
+
|
13
|
+
class NoPermission
|
14
|
+
attr_reader :perm
|
15
|
+
def initialize(perm)
|
16
|
+
@perm = perm
|
17
|
+
end
|
18
|
+
|
19
|
+
def prettify # OH GOD PLEASE HELP ME
|
20
|
+
@perm.map do |t| # <hackiness>
|
21
|
+
t.to_s.split(/_/).map(&:capitalize).join(' ')
|
22
|
+
end # </hackiness>
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Invoker
|
27
|
+
attr_reader :value, :type
|
28
|
+
def initialize(val, type, **kwargs)
|
29
|
+
if type == :regex
|
30
|
+
val = Regexp::new(val)
|
31
|
+
end
|
32
|
+
if !kwargs[:sep].nil? && type == :dual
|
33
|
+
val = val.split(kwargs[:sep])
|
34
|
+
end
|
35
|
+
@value = val
|
36
|
+
@type = type
|
37
|
+
end
|
38
|
+
|
39
|
+
def match(text)
|
40
|
+
if @type != :regex
|
41
|
+
raise "Incorrect type for function."
|
42
|
+
end
|
43
|
+
return @value.match(text)
|
44
|
+
end
|
45
|
+
|
46
|
+
def extrapolate(text) # I WANT AN EXCUSE TO SAY EXTRAPOLATE OK
|
47
|
+
case @type
|
48
|
+
when :prefix
|
49
|
+
return text[@value.length..text.length]
|
50
|
+
when :suffix
|
51
|
+
return text[0..-@value.length-1]
|
52
|
+
when :dual
|
53
|
+
return text[@value[0].length..-@value[1].length-1]
|
54
|
+
when :regex
|
55
|
+
return self.match(text)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def check(text)
|
60
|
+
case @type
|
61
|
+
when :prefix
|
62
|
+
return text.start_with? @value
|
63
|
+
when :suffix
|
64
|
+
return text.end_with? @value
|
65
|
+
when :dual
|
66
|
+
return text.start_with?(@value[0]) && text.end_with?(@value[1])
|
67
|
+
when :regex
|
68
|
+
return !self.match(text).nil?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class Arguments
|
74
|
+
attr_reader :raw
|
75
|
+
def initialize(raw)
|
76
|
+
@raw = raw
|
77
|
+
end
|
78
|
+
|
79
|
+
def switches
|
80
|
+
Commandorobo::Utils::consume_switch(@raw.join(' '))
|
81
|
+
end
|
82
|
+
|
83
|
+
def noswitch
|
84
|
+
Commandorobo::Utils::remove_switch(@raw.join(' '))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class Command
|
89
|
+
attr_reader :name, :code, :permissions, :description, :invokers
|
90
|
+
def initialize(name, code, permissions, description, invokers, bot)
|
91
|
+
@name = name
|
92
|
+
@code = code
|
93
|
+
@permissions = permissions
|
94
|
+
@description = description
|
95
|
+
@invokers = invokers.nil? ? [name] : invokers
|
96
|
+
@bot = bot
|
97
|
+
end
|
98
|
+
|
99
|
+
def invoke(event, args)
|
100
|
+
@code.call(event, args)
|
101
|
+
end
|
102
|
+
|
103
|
+
def perm_check(event)
|
104
|
+
perms = {}
|
105
|
+
@permissions.each do |p|
|
106
|
+
if p == :bot_owner
|
107
|
+
perms[p] = @bot.config['owner'].include?(event.author.id)
|
108
|
+
else
|
109
|
+
perms[p] = event.author.permission?(p)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
if !perms.values.all?
|
113
|
+
noperms = []
|
114
|
+
perms.keys.each do |p|
|
115
|
+
if !perms[p]
|
116
|
+
noperms << p
|
117
|
+
end
|
118
|
+
end
|
119
|
+
Commandorobo::NoPermission.new(noperms)
|
120
|
+
else
|
121
|
+
true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class Bot < Discordrb::Bot
|
127
|
+
attr_accessor :invokers
|
128
|
+
attr_reader :config, :commands, :listeners # what the hell ruby
|
129
|
+
def initialize(config, token, **kwargs)
|
130
|
+
@config = config
|
131
|
+
@commands = []
|
132
|
+
@listeners = {}
|
133
|
+
@invokers = config['invokers'].map {|i| Commandorobo::Invoker.new(i[1], i[0].to_sym)}
|
134
|
+
super(token: token, **kwargs)
|
135
|
+
# begin command
|
136
|
+
self.message do |ev|
|
137
|
+
meme = self.get_invoker(ev.text)
|
138
|
+
if meme.nil?
|
139
|
+
next
|
140
|
+
end
|
141
|
+
awau = meme.extrapolate(ev.text)
|
142
|
+
if awau.is_a?(MatchData)
|
143
|
+
awau = awau[1].split(/ /)
|
144
|
+
else
|
145
|
+
awau = awau.split(/ /)
|
146
|
+
end
|
147
|
+
cmd = awau.first
|
148
|
+
acmd = self.get_command cmd.to_sym
|
149
|
+
awau.shift
|
150
|
+
sm = awau
|
151
|
+
if !acmd.nil?
|
152
|
+
pc = acmd.perm_check(ev)
|
153
|
+
if pc.is_a?(Commandorobo::NoPermission)
|
154
|
+
self.idispatch(:command_noperms, ev, acmd, pc)
|
155
|
+
next
|
156
|
+
end
|
157
|
+
begin
|
158
|
+
a = acmd.invoke(ev, Commandorobo::Arguments.new(sm))
|
159
|
+
ev.respond(a)
|
160
|
+
rescue Exception => err
|
161
|
+
self.idispatch(:command_error, ev, acmd, err)
|
162
|
+
else
|
163
|
+
self.idispatch(:command_notfound, ev, acmd)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def get_command(name)
|
170
|
+
@commands.select {|c| c.invokers.include? name}.compact[0]
|
171
|
+
end
|
172
|
+
|
173
|
+
def evt(name, &block)
|
174
|
+
if name.is_a? String
|
175
|
+
name = name.to_sym
|
176
|
+
end
|
177
|
+
if @listeners[name].nil?
|
178
|
+
@listeners[name] = []
|
179
|
+
end
|
180
|
+
@listeners[name] << block
|
181
|
+
end
|
182
|
+
|
183
|
+
def idispatch(name, *args)
|
184
|
+
if name.is_a? String
|
185
|
+
name = name.to_sym
|
186
|
+
end
|
187
|
+
thing = @listeners[name]
|
188
|
+
if thing.nil?
|
189
|
+
raise "No event hooks registered for #{name.to_s}"
|
190
|
+
else
|
191
|
+
thing.each do |func|
|
192
|
+
func.call(*args)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def cmd(sym, perms:[], desc:nil, invokers:[], &block)
|
198
|
+
invokers << sym
|
199
|
+
@commands << Commandorobo::Command.new(sym, block, perms, desc, invokers, self)
|
200
|
+
end
|
201
|
+
|
202
|
+
def invoke_by(thing, type, **kwargs)
|
203
|
+
@invokers << Commandorobo::Invoker.new(thing, type, kwargs)
|
204
|
+
end
|
205
|
+
|
206
|
+
def get_invoker(text)
|
207
|
+
@invokers.map {|a| a if a.check text}.reject(&:!).first # reject all false
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
data/lib/constants.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Commandorobo
|
2
|
+
module Constants
|
3
|
+
ValidPerms = [
|
4
|
+
:create_instant_invite,
|
5
|
+
:kick_members,
|
6
|
+
:ban_members,
|
7
|
+
:administrator,
|
8
|
+
:manage_channels,
|
9
|
+
:manage_server,
|
10
|
+
:add_reactions,
|
11
|
+
:view_audit_log,
|
12
|
+
:read_messages,
|
13
|
+
:send_messages,
|
14
|
+
:send_tts_messages,
|
15
|
+
:manage_messages,
|
16
|
+
:embed_links,
|
17
|
+
:attach_files,
|
18
|
+
:read_message_history,
|
19
|
+
:mention_everyone,
|
20
|
+
:use_external_emoji,
|
21
|
+
:connect,
|
22
|
+
:speak,
|
23
|
+
:mute_members,
|
24
|
+
:deafen_members,
|
25
|
+
:move_members,
|
26
|
+
:use_voice_activity,
|
27
|
+
:change_nickname,
|
28
|
+
:manage_nicknames,
|
29
|
+
:manage_roles,
|
30
|
+
:manage_webhooks,
|
31
|
+
:manage_emojis
|
32
|
+
].freeze
|
33
|
+
end
|
34
|
+
end
|
data/lib/util.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Utility module for commandorobo
|
2
|
+
# Written by ry00001
|
3
|
+
|
4
|
+
module Commandorobo
|
5
|
+
module Utils
|
6
|
+
def self.nodash(i)
|
7
|
+
i.split('').reject {|j| j == '-'}.join('')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.consume_switch(str) # this function does not eat nintendo switches. do not try to feed it those.
|
11
|
+
nextarg = nil
|
12
|
+
parsed = false
|
13
|
+
switches = {}
|
14
|
+
ws = str.split(' ')
|
15
|
+
ws.each_with_index do |k, i|
|
16
|
+
parsed = false
|
17
|
+
if k.start_with?('-') && k.length > 1
|
18
|
+
# oh heck a switch
|
19
|
+
if k[1] == '-'
|
20
|
+
# oh heck another switch
|
21
|
+
k = self.nodash(k)
|
22
|
+
switches[k.to_sym] = ws[i+1].nil? && !ws[i+1].start_with?('-') ? true : ws[i+1]
|
23
|
+
else
|
24
|
+
# no double-switch: interpret literally
|
25
|
+
k = self.nodash(k)
|
26
|
+
if k.length == 1
|
27
|
+
switches[k.to_sym] = ws[i+1].nil? && !ws[i+1].start_with?('-') ? true : ws[i+1]
|
28
|
+
else
|
29
|
+
k.chars.each do |l|
|
30
|
+
switches[l.to_sym] = true
|
31
|
+
end
|
32
|
+
switches[switches.keys.last] = ws[i+1].nil? && !ws[i+1].start_with?('-') ? true : ws[i+1]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
return switches
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.fish_xdm_login_hack_hack_hack_hack # I don't know why this is here but it is, enjoy
|
41
|
+
'perry was here'
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.remove_switch(str)
|
45
|
+
parsed = []
|
46
|
+
skip = false
|
47
|
+
str.split(' ').each do |i|
|
48
|
+
if skip
|
49
|
+
skip = false
|
50
|
+
next
|
51
|
+
end
|
52
|
+
if i.start_with?('-') && i.length > 1
|
53
|
+
skip = true
|
54
|
+
else
|
55
|
+
parsed << i
|
56
|
+
end
|
57
|
+
end
|
58
|
+
parsed
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: commandorobo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ry00001
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: discordrb
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.1.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.1.0
|
33
|
+
description: A command framework for discordrb.
|
34
|
+
email: othery00001@gmail.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- lib/commandorobo.rb
|
40
|
+
- lib/constants.rb
|
41
|
+
- lib/util.rb
|
42
|
+
homepage: https://github.com/ry00001/commandorobo
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.7.6
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Command framework for discordrb
|
66
|
+
test_files: []
|