zetabot 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +281 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +6 -0
- data/Zeta.gemspec +74 -0
- data/bin/console +14 -0
- data/bin/setup +13 -0
- data/bin/zeta +9 -0
- data/bin/zeta-setup +13 -0
- data/lib/Zeta.rb +13 -0
- data/lib/Zeta/access.rb +84 -0
- data/lib/Zeta/admin.rb +10 -0
- data/lib/Zeta/admin/autojoin.rb +25 -0
- data/lib/Zeta/admin/bot.rb +43 -0
- data/lib/Zeta/admin/channels.rb +36 -0
- data/lib/Zeta/admin/eval.rb +43 -0
- data/lib/Zeta/admin/fifo.rb +45 -0
- data/lib/Zeta/admin/ignore.rb +112 -0
- data/lib/Zeta/admin/oper.rb +50 -0
- data/lib/Zeta/admin/plugins.rb +109 -0
- data/lib/Zeta/admin/users.rb +5 -0
- data/lib/Zeta/blacklist.rb +25 -0
- data/lib/Zeta/cache.rb +0 -0
- data/lib/Zeta/cinch.rb +35 -0
- data/lib/Zeta/config.rb +42 -0
- data/lib/Zeta/gems.rb +0 -0
- data/lib/Zeta/locale.rb +4 -0
- data/lib/Zeta/log.rb +2 -0
- data/lib/Zeta/models.rb +5 -0
- data/lib/Zeta/models/channel.rb +3 -0
- data/lib/Zeta/models/plugin.rb +3 -0
- data/lib/Zeta/models/user.rb +3 -0
- data/lib/Zeta/plugins.rb +27 -0
- data/lib/Zeta/plugins/attack.rb +61 -0
- data/lib/Zeta/plugins/botinfo.rb +83 -0
- data/lib/Zeta/plugins/darkscience.rb +215 -0
- data/lib/Zeta/plugins/dbz.rb +31 -0
- data/lib/Zeta/plugins/dcc.rb +25 -0
- data/lib/Zeta/plugins/dnsbl.rb +36 -0
- data/lib/Zeta/plugins/echo.rb +15 -0
- data/lib/Zeta/plugins/eightball.rb +53 -0
- data/lib/Zeta/plugins/fml.rb +35 -0
- data/lib/Zeta/plugins/fnord.rb +329 -0
- data/lib/Zeta/plugins/gem.rb +0 -0
- data/lib/Zeta/plugins/gif.rb +73 -0
- data/lib/Zeta/plugins/help.rb +32 -0
- data/lib/Zeta/plugins/libsecure.rb +34 -0
- data/lib/Zeta/plugins/macros.rb +124 -0
- data/lib/Zeta/plugins/movie.rb +67 -0
- data/lib/Zeta/plugins/pdfinfo.rb +69 -0
- data/lib/Zeta/plugins/rainbow.rb +65 -0
- data/lib/Zeta/plugins/russian_roulette.rb +90 -0
- data/lib/Zeta/plugins/seen.rb +77 -0
- data/lib/Zeta/plugins/silly.rb +183 -0
- data/lib/Zeta/plugins/snooper.rb +146 -0
- data/lib/Zeta/plugins/urban.rb +60 -0
- data/lib/Zeta/plugins/weather.rb +203 -0
- data/lib/Zeta/plugins/whois.rb +25 -0
- data/lib/Zeta/plugins/wiki.rb +75 -0
- data/lib/Zeta/plugins/wolfram.rb +46 -0
- data/lib/Zeta/tasks/db.rb +0 -0
- data/lib/Zeta/version.rb +3 -0
- data/lib/generators/config/config.rb +0 -0
- data/lib/generators/plugin/new_plugin.rb +0 -0
- data/locale/en/8ball.yml +0 -0
- data/locale/en/attack.yml +148 -0
- data/locale/en/dbz.yml +10 -0
- data/locale/en/ircop.yml +5 -0
- data/locale/en/macros.yml +98 -0
- data/locale/en/meme.yml +27 -0
- metadata +636 -0
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "zeta"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
set -euo pipefail
|
3
|
+
IFS=$'\n\t'
|
4
|
+
set -vx
|
5
|
+
|
6
|
+
bundle install
|
7
|
+
|
8
|
+
# Do any other automated setup that you need to do here
|
9
|
+
mkdir -p ~/.zeta/cache
|
10
|
+
|
11
|
+
end
|
12
|
+
Dir.mkdir( File.join(Dir.home, ".zeta"), 0700)
|
13
|
+
Dir.mkdir(File.join(Dir.home, ".zeta", 'cache'), 0700)
|
data/bin/zeta
ADDED
data/bin/zeta-setup
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
Puts 'Setting up ZetaBot'
|
3
|
+
puts 'Checking if .zeta is in your home directory'
|
4
|
+
unless Dir.exists? File.join(Dir.home, '.zeta')
|
5
|
+
puts 'Creating .zeta/'
|
6
|
+
Dir.mkdir( File.join(Dir.home, ".zeta"), 0700)
|
7
|
+
puts 'Creating .zeta/cache/'
|
8
|
+
Dir.mkdir(File.join(Dir.home, ".zeta", 'cache'), 0700)
|
9
|
+
puts 'Creating .zeta/db/'
|
10
|
+
Dir.mkdir(File.join(Dir.home, ".zeta", 'db'), 0700)
|
11
|
+
puts 'Creating .zeta/log/'
|
12
|
+
Dir.mkdir(File.join(Dir.home, ".zeta", 'log'), 0700)
|
13
|
+
end
|
data/lib/Zeta.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Zeta; end
|
2
|
+
|
3
|
+
require 'Zeta/version'
|
4
|
+
require 'Zeta/cache'
|
5
|
+
require 'Zeta/config'
|
6
|
+
require 'Zeta/access'
|
7
|
+
require 'Zeta/blacklist'
|
8
|
+
require 'Zeta/cinch'
|
9
|
+
require 'Zeta/models'
|
10
|
+
require 'Zeta/admin'
|
11
|
+
require 'Zeta/locale'
|
12
|
+
require 'Zeta/plugins'
|
13
|
+
require 'Zeta/log'
|
data/lib/Zeta/access.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
module Cinch
|
2
|
+
module Plugin
|
3
|
+
|
4
|
+
module ClassMethods
|
5
|
+
def enable_acl(lvl= :nobody, secure_chan=false)
|
6
|
+
hook(:pre, :for => [:match], :method => lambda { |m| check?(m,lvl,secure_chan) })
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def check?(m, lvl, secure_chan)
|
11
|
+
# Make sure we are actually getting a channel object
|
12
|
+
if m.class == Cinch::Channel
|
13
|
+
channel = m
|
14
|
+
elsif m.class == Cinch::Message
|
15
|
+
channel = m.channel
|
16
|
+
else
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
# Get User
|
21
|
+
if m.class == Cinch::User
|
22
|
+
user = m
|
23
|
+
elsif m.class == Cinch::Message
|
24
|
+
user = m.user
|
25
|
+
else
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
# Oper Overide
|
30
|
+
if Config.oper_overide
|
31
|
+
return true if user.oper
|
32
|
+
end
|
33
|
+
|
34
|
+
# Check Channel status
|
35
|
+
return false if Blacklist.channels.include? channel.to_s
|
36
|
+
|
37
|
+
# Check Ignore status
|
38
|
+
return false if Blacklist.users.include? user.to_s
|
39
|
+
|
40
|
+
# Only check if user has permission in the secure channel
|
41
|
+
channel = Channel(Config.secure_channel.to_s) if secure_chan
|
42
|
+
|
43
|
+
# Authorization method
|
44
|
+
if Config.secure_mode == 'channel'
|
45
|
+
# Check lvl privilege
|
46
|
+
case lvl
|
47
|
+
when :O, :oper
|
48
|
+
return true if user.oper
|
49
|
+
false
|
50
|
+
when :q, :owner # Owner
|
51
|
+
return true if channel.owners.include? user
|
52
|
+
false
|
53
|
+
when :a, :admin # Admin
|
54
|
+
return true if channel.admins.include? user
|
55
|
+
false
|
56
|
+
when :o, :op # Op
|
57
|
+
return true if channel.ops.include? user
|
58
|
+
false
|
59
|
+
when :h, :halfop # Half-Op
|
60
|
+
return true if channel.half_ops.include? user
|
61
|
+
false
|
62
|
+
when :v, :voice # Voice
|
63
|
+
return true if channel.voiced.include? user
|
64
|
+
false
|
65
|
+
when :nobody
|
66
|
+
return true
|
67
|
+
else
|
68
|
+
return false
|
69
|
+
end
|
70
|
+
elsif Config.secure_mode == 'identify'
|
71
|
+
# TODO
|
72
|
+
# Require you to identify with bot before usage
|
73
|
+
elsif Config.secure_mode == 'hostmask'
|
74
|
+
# TODO
|
75
|
+
# Require hostmask
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def log2chan(msg, level=:notice)
|
80
|
+
Channel(Config.log_channel.to_s).send "[#{level.to_s}] #{msg}"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
data/lib/Zeta/admin.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Admin; end
|
2
|
+
require 'Zeta/admin/channels'
|
3
|
+
require 'Zeta/admin/eval'
|
4
|
+
require 'Zeta/admin/fifo'
|
5
|
+
require 'Zeta/admin/oper'
|
6
|
+
require 'Zeta/admin/plugins'
|
7
|
+
require 'Zeta/admin/users'
|
8
|
+
require 'Zeta/admin/autojoin'
|
9
|
+
require 'Zeta/admin/ignore'
|
10
|
+
require 'Zeta/admin/bot'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Admin
|
2
|
+
class Autojoin
|
3
|
+
include Cinch::Plugin
|
4
|
+
include Cinch::Helpers
|
5
|
+
|
6
|
+
# Listeners
|
7
|
+
listen_to :invite, method: :invited
|
8
|
+
|
9
|
+
# Methods
|
10
|
+
def invited(m)
|
11
|
+
puts "triggered"
|
12
|
+
if Config.options.dig :join_on_invite
|
13
|
+
return false if Blacklist.users.include? m.user.nick.to_s
|
14
|
+
return false if Blacklist.channels.include? m.channel.to_s
|
15
|
+
|
16
|
+
log2chan("#{m.user.nick} has requested me join #{m.channel}", :notice)
|
17
|
+
|
18
|
+
Channel(m.channel).join
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# AutoLoad
|
25
|
+
Bot.config.plugins.plugins.push Admin::Autojoin
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Admin
|
2
|
+
class Bot
|
3
|
+
include Cinch::Plugin
|
4
|
+
include Cinch::Helpers
|
5
|
+
|
6
|
+
enable_acl(:oper)
|
7
|
+
|
8
|
+
set(
|
9
|
+
plugin_name: "BotAdmin",
|
10
|
+
help: "Bot administrator-only private commands.\nUsage: `~nick [channel]`;",
|
11
|
+
)
|
12
|
+
|
13
|
+
# Regex
|
14
|
+
match /set nick (.+)/, method: :nick
|
15
|
+
match /set mode (.+)/, method: :mode
|
16
|
+
match /die(?: (.+))?/, method: :quit, group: :quit
|
17
|
+
|
18
|
+
# Methods
|
19
|
+
def nick(m, nick)
|
20
|
+
bot.nick = nick
|
21
|
+
synchronize(:nickchange) do
|
22
|
+
@bot.handlers.dispatch :admin, m, "My nick got changed from #{@bot.last_nick} to #{@bot.nick} by #{m.user.nick}", m.target
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def mode(m, nick)
|
27
|
+
bot.modes = m
|
28
|
+
end
|
29
|
+
|
30
|
+
def quit(m, msg=nil)
|
31
|
+
msg ||= m.user.nick
|
32
|
+
@bot.handlers.dispatch :admin, m, "I am being shut down NOW!#{" - Reason: " + msg unless msg.nil?}", m.target
|
33
|
+
sleep 2
|
34
|
+
bot.quit(msg)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# AutoLoad
|
43
|
+
Bot.config.plugins.plugins.push Admin::Bot
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Admin
|
2
|
+
class Channels
|
3
|
+
include Cinch::Plugin
|
4
|
+
include Cinch::Helpers
|
5
|
+
|
6
|
+
enable_acl(:operator, true)
|
7
|
+
|
8
|
+
set(
|
9
|
+
plugin_name: 'ChannelAdmin',
|
10
|
+
help: "Bot administrator-only private commands.\nUsage: `?join [channel]`; `?part [channel] <reason>`; `?quit [reason]`;",
|
11
|
+
)
|
12
|
+
|
13
|
+
# Regex
|
14
|
+
match /join (.+)/, method: :join
|
15
|
+
match /part(?: (\S+))?(?: (.+))?/, method: :part, group: :part
|
16
|
+
|
17
|
+
def join(m, channel)
|
18
|
+
channel.split(", ").each {|ch|
|
19
|
+
Channel(ch).join
|
20
|
+
@bot.handlers.dispatch :admin, m, "Attempt to join #{ch.split[0]} by #{m.user.nick}...", m.target
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def part(m, channel=nil, msg=nil)
|
25
|
+
channel ||= m.channel.name
|
26
|
+
msg ||= m.user.nick
|
27
|
+
Channel(channel).part(msg) if channel
|
28
|
+
@bot.handlers.dispatch :admin, m, "Parted #{channel}#{" - #{msg}" unless msg.nil?}", m.target
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# AutoLoad
|
36
|
+
Bot.config.plugins.plugins.push Admin::Channels
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Admin
|
2
|
+
class Eval
|
3
|
+
include Cinch::Plugin
|
4
|
+
|
5
|
+
enable_acl(:oper)
|
6
|
+
|
7
|
+
set(
|
8
|
+
plugin_name: "Bot_Eval",
|
9
|
+
help: "Bot administrator-only private commands.\nUsage: `?er <code>`;",
|
10
|
+
)
|
11
|
+
|
12
|
+
# Regex
|
13
|
+
match /e (.+)/, method: :boteval
|
14
|
+
match /eval (.+)/, method: :boteval
|
15
|
+
match /ereturn (.+)/, method: :botevalreturn
|
16
|
+
match /er (.+)/, method: :botevalreturn
|
17
|
+
match /evalmsg (.+)/, method: :botevalmsg
|
18
|
+
match /em (.+)/, method: :botevalmsg
|
19
|
+
|
20
|
+
def boteval(m, s)
|
21
|
+
eval(s)
|
22
|
+
rescue => e
|
23
|
+
m.user.send "eval error: %s\n- %s (%s)" % [s, e.message, e.class.name]
|
24
|
+
end
|
25
|
+
|
26
|
+
def botevalreturn(m, s)
|
27
|
+
return m.reply eval(s)
|
28
|
+
rescue => e
|
29
|
+
m.user.send "eval error: %s\n- %s (%s)" % [s, e.message, e.class.name]
|
30
|
+
end
|
31
|
+
|
32
|
+
def botevalmsg(m, s)
|
33
|
+
return m.user.msg eval(s)
|
34
|
+
rescue => e
|
35
|
+
m.user.send "eval error: %s\n- %s (%s)" % [s, e.message, e.class.name]
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# AutoLoad
|
43
|
+
Bot.config.plugins.plugins.push Admin::Eval
|
@@ -0,0 +1,45 @@
|
|
1
|
+
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
2
|
+
require 'mkfifo'
|
3
|
+
end
|
4
|
+
|
5
|
+
# Named pipe plugin for Cinch.
|
6
|
+
module Admin
|
7
|
+
class Fifo
|
8
|
+
include Cinch::Plugin
|
9
|
+
listen_to :connect, :method => :open_fifo
|
10
|
+
listen_to :disconnect, :method => :close_fifo
|
11
|
+
|
12
|
+
def open_fifo(m)
|
13
|
+
# Sometimes FiFo is left open on crash, remove old fifo
|
14
|
+
if File.exists?(File.join(Dir.home, '.zeta', 'zeta.io'))
|
15
|
+
File.delete(File.join(Dir.home, '.zeta', 'zeta.io'))
|
16
|
+
end
|
17
|
+
|
18
|
+
File.mkfifo(File.join(Dir.home, '.zeta', 'zeta.io') || raise(ArgumentError, "No FIFO path given!"))
|
19
|
+
File.chmod(0660, File.join(Dir.home, '.zeta', 'zeta.io'))
|
20
|
+
|
21
|
+
File.open(File.join(Dir.home, '.zeta', 'zeta.io'), "r+") do |fifo|
|
22
|
+
bot.info "Opened named pipe (FIFO) at #{File.join(Dir.home, '.zeta', 'zeta.io')}"
|
23
|
+
|
24
|
+
fifo.each_line do |line|
|
25
|
+
msg = line.strip
|
26
|
+
bot.debug "Got message from the FIFO: #{msg}"
|
27
|
+
bot.irc.send msg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
def close_fifo(msg)
|
34
|
+
File.delete(File.join(Dir.home, '.zeta', 'zeta.io'))
|
35
|
+
bot.info "Deleted named pipe #{File.join(Dir.home, '.zeta', 'zeta.io')}"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# AutoLoad if Not Jruby
|
43
|
+
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
44
|
+
Bot.config.plugins.plugins.push Admin::Fifo
|
45
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Admin
|
2
|
+
class Ignore
|
3
|
+
include Cinch::Plugin
|
4
|
+
include Cinch::Helpers
|
5
|
+
|
6
|
+
enable_acl(:operator, true)
|
7
|
+
|
8
|
+
set(
|
9
|
+
plugin_name: "BotAdmin",
|
10
|
+
help: "Bot administrator-only private commands.\nUsage: `~nick [channel]`;",
|
11
|
+
)
|
12
|
+
|
13
|
+
# Regex
|
14
|
+
match /ignore (.+)/, method: :ignore_user
|
15
|
+
match /unignore (.+)/, method: :unignore_user
|
16
|
+
|
17
|
+
match /disable (.+)/, method: :disable_channel
|
18
|
+
match /enable (.+)/, method: :enable_channel
|
19
|
+
match 'disable', method: :disable_channel
|
20
|
+
match 'enable', method: :enable_channel
|
21
|
+
|
22
|
+
match 'ignorelist', method: :ignore_list
|
23
|
+
|
24
|
+
match 'sync', method: :sync
|
25
|
+
|
26
|
+
def finalize
|
27
|
+
save_blacklist()
|
28
|
+
end
|
29
|
+
|
30
|
+
# Methods
|
31
|
+
def ignore_user(m, nickname)
|
32
|
+
nickname.rstrip!
|
33
|
+
return m.reply("You can't ignore yourself") if m.user.nick == nickname
|
34
|
+
u = User(nickname)
|
35
|
+
if m.channel.users.member?(u)
|
36
|
+
if Blacklist.users.include? u
|
37
|
+
m.reply("#{nickname} is already being ignored")
|
38
|
+
else
|
39
|
+
Blacklist.users << u.to_s
|
40
|
+
m.action_reply "is now ignoring #{nickname}"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
m.reply "#{nickname} isn't currently in channel"
|
44
|
+
end
|
45
|
+
save_blacklist()
|
46
|
+
end
|
47
|
+
|
48
|
+
def unignore_user(m, nickname)
|
49
|
+
nickname.rstrip!
|
50
|
+
u = User(nickname)
|
51
|
+
if Blacklist.users.include?(u.to_s)
|
52
|
+
Blacklist.users.delete(u.to_s)
|
53
|
+
m.action_reply "is no longer ignoring #{nickname}"
|
54
|
+
else
|
55
|
+
m.reply "#{nickname} isn't on the ignore list"
|
56
|
+
end
|
57
|
+
save_blacklist()
|
58
|
+
end
|
59
|
+
|
60
|
+
def disable_channel(m, channel=nil)
|
61
|
+
if channel
|
62
|
+
if Blacklist.channels.include?(channel.to_s)
|
63
|
+
m.reply('Channel is currently disabled')
|
64
|
+
else
|
65
|
+
Blacklist.channels << channel.to_s
|
66
|
+
m.action_reply "has disabled #{channel} buffer"
|
67
|
+
end
|
68
|
+
else
|
69
|
+
if Blacklist.channels.include?(m.channel.to_s)
|
70
|
+
m.reply('Channel is currently disabled')
|
71
|
+
else
|
72
|
+
Blacklist.channels << m.channel.to_s.to_s
|
73
|
+
m.action_reply "has disabled #{m.channel.to_s} buffer"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
save_blacklist()
|
77
|
+
end
|
78
|
+
|
79
|
+
def enable_channel(m, channel=nil)
|
80
|
+
if channel
|
81
|
+
if Blacklist.channels.include?(channel.to_s)
|
82
|
+
Blacklist.channels.delete(channel.to_s)
|
83
|
+
m.action_reply "has enabled #{channel} buffer"
|
84
|
+
else
|
85
|
+
m.reply('Channel is currently enabled')
|
86
|
+
end
|
87
|
+
else
|
88
|
+
if Blacklist.channels.include?(m.channel.to_s)
|
89
|
+
Blacklist.channels.delete(m.channel.to_s)
|
90
|
+
m.action_reply "has enabled #{m.channel.to_s} buffer"
|
91
|
+
else
|
92
|
+
m.reply('Channel is currently enabled')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
save_blacklist()
|
96
|
+
end
|
97
|
+
|
98
|
+
def ignore_list(m)
|
99
|
+
m.reply "Currently ignored users are: #{Blacklist.users.join(', ')}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def sync(m)
|
103
|
+
save_blacklist()
|
104
|
+
m.action_reply 'is now synced!'
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
# AutoLoad
|
112
|
+
Bot.config.plugins.plugins.push Admin::Ignore
|