zetabot 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Plugins
|
4
|
+
class UrbanDictionary
|
5
|
+
include Cinch::Plugin
|
6
|
+
include Cinch::Helpers
|
7
|
+
|
8
|
+
enable_acl(:nobody)
|
9
|
+
|
10
|
+
set(
|
11
|
+
plugin_name: 'UrbanDictionary',
|
12
|
+
help: "Urban Dictionary -- Grabs a term from urbandictionary.com.\nUsage: `?urban <term>`; `?wotd`; `!?woty`"
|
13
|
+
)
|
14
|
+
|
15
|
+
match /urban (.*)/, method: :query
|
16
|
+
match /ud (.*)/, method: :query
|
17
|
+
match /wotd/, method: :wotd
|
18
|
+
match "ud", method: :wotd
|
19
|
+
|
20
|
+
def query(m, query)
|
21
|
+
m.reply "UD↦ #{search(query)}"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def wotd(m)
|
26
|
+
url = URI.encode "http://www.urbandictionary.com/"
|
27
|
+
doc = Nokogiri.HTML(
|
28
|
+
# RestClient.get(url)
|
29
|
+
open(url)
|
30
|
+
)
|
31
|
+
word = doc.at_css('.word').text.strip[0..40]
|
32
|
+
meaning = doc.at_css('.meaning').text.strip[0..450] + "... \u263A"
|
33
|
+
m.reply "UD↦ #{word} -- #{meaning}"
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def search(query)
|
38
|
+
url = URI.encode "http://api.urbandictionary.com/v0/define?term=#{query}"
|
39
|
+
# Nokogiri.HTML(open url).at_css('.meaning').text.strip[0..500]
|
40
|
+
|
41
|
+
# Load API data
|
42
|
+
data = JSON.parse(
|
43
|
+
#RestClient.get(url)
|
44
|
+
open(url).read
|
45
|
+
)
|
46
|
+
|
47
|
+
# Return if nothing is found
|
48
|
+
return 'No Results found' if data['result_type'] == 'no_results'
|
49
|
+
|
50
|
+
# Return first definition
|
51
|
+
string = data['list'].first['definition'].gsub(/\r|\n|\n\r/, ' ')
|
52
|
+
string[0..450] + "... \u263A"
|
53
|
+
rescue => e
|
54
|
+
e.message
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# AutoLoad
|
60
|
+
Bot.config.plugins.plugins.push Plugins::UrbanDictionary
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'persist'
|
3
|
+
|
4
|
+
module Plugins
|
5
|
+
# Forecast is a Cinch plugin for getting the weather forecast.
|
6
|
+
# @original_author Jonah Ruiz <jonah@pixelhipsters.com>
|
7
|
+
# @author Liothen <liothen@flagrun.net>
|
8
|
+
class Weather
|
9
|
+
include Cinch::Plugin
|
10
|
+
include Cinch::Helpers
|
11
|
+
enable_acl
|
12
|
+
|
13
|
+
set(
|
14
|
+
plugin_name: "Weather",
|
15
|
+
help: "Get the Weather?.\nUsage: `?weather`\nUsage: `?wx zip` `?w zip` `?setw zip` `?forecast zip`",
|
16
|
+
)
|
17
|
+
|
18
|
+
match /forecast (.+)/, method: :forecast
|
19
|
+
match /w (.+)/, method: :weather
|
20
|
+
match 'w', method: :weather
|
21
|
+
match /setw (.+)/, method: :set_location
|
22
|
+
match /wx (.+)/, method: :weather
|
23
|
+
match /weather (.+)/, method: :weather
|
24
|
+
match /almanac (.+)/, method: :almanac
|
25
|
+
match /hurricane/, method: :hurricane
|
26
|
+
|
27
|
+
#####
|
28
|
+
def initialize(*args)
|
29
|
+
@store = Persist.new( File.join(Dir.home, '.zeta', 'cache', 'weather.pstore') )
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
# ?forecast <location>
|
34
|
+
def forecast(msg, query)
|
35
|
+
location = geolookup(query)
|
36
|
+
return msg.reply "No results found for #{query}." if location.nil?
|
37
|
+
|
38
|
+
data = get_conditions(location)
|
39
|
+
return msg.reply 'Problem getting data. Try again later.' if data.nil?
|
40
|
+
|
41
|
+
msg.user.msg(weather_summary(data))
|
42
|
+
end
|
43
|
+
|
44
|
+
# ?w <location>
|
45
|
+
def weather(msg, query=nil)
|
46
|
+
if !@store[msg.user.to_s].nil? && query.nil?
|
47
|
+
location = geolookup(@store[msg.user.to_s])
|
48
|
+
elsif query.nil?
|
49
|
+
return msg.reply 'No location set. ?setw <location>'
|
50
|
+
else
|
51
|
+
location = geolookup(query)
|
52
|
+
end
|
53
|
+
return msg.reply "No results found for #{query}." if location.nil?
|
54
|
+
|
55
|
+
data = get_conditions(location)
|
56
|
+
return msg.reply 'Problem getting data. Try again later.' if data.nil?
|
57
|
+
|
58
|
+
#[ Clarkston, WA, United States | Cloudy | Temp: 34 F (1 C) | Humidity: 73% | Winds: 8 mph ]
|
59
|
+
reply_data = "∴ #{data.county}, #{data.country} " \
|
60
|
+
"≈ #{data.weather} #{data.temperature} " \
|
61
|
+
"≈ Humidity: #{data.relative_humidity} " \
|
62
|
+
"≈ Pressure: #{data.pressure_in} psi (#{data.pressure_mb} mmHg) " \
|
63
|
+
"≈ Wind: #{data.wind} ≈ Alerts: #{data.alerts} ∴"
|
64
|
+
msg.reply(reply_data)
|
65
|
+
end
|
66
|
+
|
67
|
+
# ?setw <location>
|
68
|
+
def set_location(msg,query)
|
69
|
+
location = geolookup(query)
|
70
|
+
return msg.reply "No results found for #{query}." if location.nil?
|
71
|
+
@store[msg.user.to_s] = query unless location.nil?
|
72
|
+
data = get_conditions(location)
|
73
|
+
msg.reply "Your location is now set to #{data.county}, #{data.country}!"
|
74
|
+
end
|
75
|
+
|
76
|
+
# ?hurricane
|
77
|
+
def hurricane(msg)
|
78
|
+
url = URI.encode "http://api.wunderground.com/api/#{Zsec.wunderground}/currenthurricane/view.json"
|
79
|
+
location = JSON.parse(
|
80
|
+
# RestClient.get(url)
|
81
|
+
open(url).read
|
82
|
+
)
|
83
|
+
return msg.reply "No results found for #{query}." if location.nil?
|
84
|
+
reply_msg = "∴ #{location['currenthurricane'][0]['stormInfo']['stormName_Nice']} " \
|
85
|
+
"(#{location['currenthurricane'][0]['stormInfo']['stormNumber']}) "\
|
86
|
+
"≈ Category #{location['currenthurricane'][0]['Current']['SaffirSimpsonCategory']} " \
|
87
|
+
"≈ Wind #{location['currenthurricane'][0]['Current']['WindSpeed']['Mph']} mph " \
|
88
|
+
"(#{location['currenthurricane'][0]['Current']['WindSpeed']['Kph']} kph) " \
|
89
|
+
"≈ Wind Gust #{location['currenthurricane'][0]['Current']['WindGust']['Mph']} mph " \
|
90
|
+
"(#{location['currenthurricane'][0]['Current']['WindGust']['Kph']} kph) " \
|
91
|
+
"≈ #{location['currenthurricane'][0]['Current']['Time']['pretty']} ∴"
|
92
|
+
msg.reply(reply_msg)
|
93
|
+
end
|
94
|
+
|
95
|
+
# ?almanac <location>
|
96
|
+
def almanac(msg,locale)
|
97
|
+
url = URI.encode "http://api.wunderground.com/api/#{Config.secrets[:wunderground]}/almanac/q/#{locale}.json"
|
98
|
+
location = JSON.parse(
|
99
|
+
# RestClient.get(url)
|
100
|
+
open(url).read
|
101
|
+
)
|
102
|
+
return msg.reply "No results found for #{query}." if location.nil?
|
103
|
+
|
104
|
+
time = Time.now()
|
105
|
+
|
106
|
+
data = OpenStruct.new(
|
107
|
+
date: time.strftime('%B, %d %Y (%A) '),
|
108
|
+
airport: location['almanac']['airport_code'],
|
109
|
+
high_norm_f: location['almanac']['temp_high']['normal']['F'],
|
110
|
+
high_norm_c: location['almanac']['temp_high']['normal']['C'],
|
111
|
+
high_record_y: location['almanac']['temp_high']['recordyear'],
|
112
|
+
high_record_f: location['almanac']['temp_high']['record']['F'],
|
113
|
+
high_record_c: location['almanac']['temp_high']['normal']['C'],
|
114
|
+
low_norm_f: location['almanac']['temp_low']['normal']['F'],
|
115
|
+
low_norm_c: location['almanac']['temp_low']['normal']['C'],
|
116
|
+
low_record_y: location['almanac']['temp_low']['recordyear'],
|
117
|
+
low_record_f: location['almanac']['temp_low']['record']['F'],
|
118
|
+
low_record_c: location['almanac']['temp_low']['normal']['C'],
|
119
|
+
)
|
120
|
+
|
121
|
+
reply_msg = "∴ Almanac #{data.date} ≈ Airport #{data.airport} " \
|
122
|
+
"≈ Normal #{data.high_norm_f} F (#{data.high_norm_c} C) | #{data.low_norm_f} F (#{data.low_norm_c} C) " \
|
123
|
+
"≈ High #{data.high_record_f} F (#{data.high_record_c} C) [#{data.high_record_y}] " \
|
124
|
+
"≈ Low #{data.low_record_f} F (#{data.low_record_c} C) [#{data.low_record_y}] ∴"
|
125
|
+
|
126
|
+
msg.reply(reply_msg)
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
# -private
|
131
|
+
def geolookup(locale)
|
132
|
+
url = URI.encode "http://api.wunderground.com/api/#{Config.secrets[:wunderground]}/geolookup/q/#{locale}.json"
|
133
|
+
location = JSON.parse(
|
134
|
+
# RestClient.get(url).force_encoding("UTF-8")
|
135
|
+
open(url).read
|
136
|
+
)
|
137
|
+
location['location']['l']
|
138
|
+
rescue
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
|
142
|
+
def get_conditions(location)
|
143
|
+
data = JSON.parse(
|
144
|
+
open("http://api.wunderground.com/api/#{Config.secrets[:wunderground]}/alerts/conditions#{location}.json").read
|
145
|
+
#RestClient.get("http://api.wunderground.com/api/#{Zsec.wunderground}/conditions#{location}.json")
|
146
|
+
)
|
147
|
+
current = data['current_observation']
|
148
|
+
alerts = data['alerts'].empty? ? 'none' : data['alerts'].map { |l| l['type'] }.join(',')
|
149
|
+
location_data = current['display_location']
|
150
|
+
|
151
|
+
OpenStruct.new(
|
152
|
+
county: location_data['full'],
|
153
|
+
country: location_data['country'],
|
154
|
+
|
155
|
+
lat: location_data['latitude'],
|
156
|
+
lng: location_data['longitude'],
|
157
|
+
|
158
|
+
observation_time: current['observation_time'],
|
159
|
+
weather: current['weather'],
|
160
|
+
temp_fahrenheit: current['temp_f'],
|
161
|
+
temp_celcius: current['temp_c'],
|
162
|
+
temperature: current['temperature_string'],
|
163
|
+
relative_humidity: current['relative_humidity'],
|
164
|
+
feels_like: current['feelslike_string'],
|
165
|
+
uv_level: current['UV'],
|
166
|
+
|
167
|
+
wind: current['wind_string'],
|
168
|
+
wind_direction: current['wind_dir'],
|
169
|
+
wind_degrees: current['wind_degrees'],
|
170
|
+
wind_mph: current['wind_mph'],
|
171
|
+
wind_gust_mph: current['wind_gust_mph'],
|
172
|
+
wind_kph: current['wind_kph'],
|
173
|
+
pressure_in: current['pressure_in'],
|
174
|
+
pressure_mb: current['pressure_mb'],
|
175
|
+
|
176
|
+
alerts: alerts,
|
177
|
+
|
178
|
+
forecast_url: current['forecast_url']
|
179
|
+
)
|
180
|
+
rescue
|
181
|
+
nil
|
182
|
+
end
|
183
|
+
|
184
|
+
def weather_summary(data)
|
185
|
+
%Q{
|
186
|
+
Forecast for: #{data.county}, #{data.country}
|
187
|
+
Latitude: #{data.lat}, Longitude: #{data.lng}
|
188
|
+
Weather is #{data.weather}, #{data.feels_like}
|
189
|
+
UV: #{data.uv_level}, Humidity: #{data.relative_humidity}
|
190
|
+
Wind: #{data.wind}
|
191
|
+
Direction: #{data.wind_direction}, Degrees: #{data.wind_degrees},
|
192
|
+
#{data.observation_time}
|
193
|
+
More Info: #{data.forecast_url}}
|
194
|
+
rescue
|
195
|
+
'Problem fetching the weather summary. Try again later.'
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
# AutoLoad
|
203
|
+
Bot.config.plugins.plugins.push Plugins::Weather
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Plugins
|
2
|
+
class Whois
|
3
|
+
include Cinch::Plugin
|
4
|
+
include Cinch::Helpers
|
5
|
+
|
6
|
+
# enable_acl
|
7
|
+
|
8
|
+
self.plugin_name = 'Whois'
|
9
|
+
self.help = 'Resync your user'
|
10
|
+
|
11
|
+
# Regex
|
12
|
+
match 'whois', method: :do_whois
|
13
|
+
|
14
|
+
# Methods
|
15
|
+
def do_whois(m)
|
16
|
+
m.user.refresh
|
17
|
+
m.user.notice "Refreshing #{m.user.nick}"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# AutoLoad
|
25
|
+
Bot.config.plugins.plugins.push Plugins::Whois
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# extracted from https://github.com/bhaberer/cinch-wikipedia.git
|
3
|
+
# Great gem
|
4
|
+
require 'cinch'
|
5
|
+
require 'cinch/toolbox'
|
6
|
+
# require 'cinch/cooldown'
|
7
|
+
# require 'cinch-cooldown'
|
8
|
+
|
9
|
+
module Plugins
|
10
|
+
# Plugin to allow users to search wikipedia.
|
11
|
+
class Wikipedia
|
12
|
+
include Cinch::Plugin
|
13
|
+
include Cinch::Helpers
|
14
|
+
enable_acl
|
15
|
+
|
16
|
+
# enforce_cooldown
|
17
|
+
|
18
|
+
self.help = 'Use ?wiki <term> to see the Wikipedia info for that term.'
|
19
|
+
|
20
|
+
match /wiki (.*)/
|
21
|
+
match /wikipedia (.*)/
|
22
|
+
|
23
|
+
def initialize(*args)
|
24
|
+
super
|
25
|
+
@max_length = config[:max_length] || 300
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute(m, term)
|
29
|
+
m.reply wiki(term)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def wiki(term)
|
35
|
+
# URI Encode
|
36
|
+
term = URI.escape(term, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
37
|
+
url = "http://en.wikipedia.org/w/index.php?search=#{term}"
|
38
|
+
|
39
|
+
# Truncate text and url if they are too long
|
40
|
+
text = Cinch::Toolbox.truncate(get_def(term, url), @max_length)
|
41
|
+
url = Cinch::Toolbox.shorten(url)
|
42
|
+
|
43
|
+
"Wiki ∴ #{text} [#{url}]"
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_def(term, url)
|
47
|
+
cats = Cinch::Toolbox.get_html_element(url, '#mw-normal-catlinks')
|
48
|
+
if cats && cats.include?('Disambiguation')
|
49
|
+
wiki_text = "'#{term} is too vague and lead to a disambiguation page."
|
50
|
+
else
|
51
|
+
wiki_text = Cinch::Toolbox.get_html_element(url, '#mw-content-text p')
|
52
|
+
if wiki_text.nil? || wiki_text.include?('Help:Searching')
|
53
|
+
return not_found(wiki_text, url)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
wiki_text
|
57
|
+
end
|
58
|
+
|
59
|
+
def not_found(wiki_text, url)
|
60
|
+
msg = "I couldn't find anything for that search, "
|
61
|
+
alt_term_text = Cinch::Toolbox.get_html_element(url, '.searchdidyoumean')
|
62
|
+
if alt_term_text
|
63
|
+
alt_term = alt_term_text[/\ADid you mean: (\w+)\z/, 1]
|
64
|
+
msg << "did you mean '#{alt_term}'?"
|
65
|
+
else
|
66
|
+
msg << 'sorry!'
|
67
|
+
end
|
68
|
+
msg
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# AutoLoad
|
75
|
+
Bot.config.plugins.plugins.push Plugins::Wikipedia
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'crack'
|
2
|
+
|
3
|
+
module Plugins
|
4
|
+
class Wolfram
|
5
|
+
include Cinch::Plugin
|
6
|
+
include Cinch::Helpers
|
7
|
+
include ActionView::Helpers::DateHelper
|
8
|
+
enable_acl
|
9
|
+
|
10
|
+
|
11
|
+
self.plugin_name = 'Wolfram Alpha plugin'
|
12
|
+
self.help = 'WIP'
|
13
|
+
|
14
|
+
match /wolfram (.+)/, method: :calculate
|
15
|
+
match /wolframalpha (.+)/, method: :calculate
|
16
|
+
match /calc (.+)/, method: :calculate
|
17
|
+
|
18
|
+
def calculate(m, query)
|
19
|
+
# Rescue incase something goes wrong
|
20
|
+
begin
|
21
|
+
debug 'Query: ' + query
|
22
|
+
url = URI.encode "http://api.wolframalpha.com/v2/query?input=#{query}&appid=#{ENV['ZETA_WOLFRAM']}&primary=true&format=plaintext"
|
23
|
+
request = open(url).read
|
24
|
+
data = Crack::XML.parse(request)
|
25
|
+
pod0 = data['queryresult']['pod'][0]['subpod']['plaintext'].strip
|
26
|
+
pod1 = data['queryresult']['pod'][1]['subpod']['plaintext'].strip
|
27
|
+
return 'Unable to get a results' if pod0.nil?
|
28
|
+
|
29
|
+
if pod1.lines.count > 2
|
30
|
+
m.user.send "# Wolfram Results #\n #{pod0}\n #{pod1}", true
|
31
|
+
elsif pod0.length > 400
|
32
|
+
m.user.send("#{pod0} #{pod1}", true)
|
33
|
+
else
|
34
|
+
m.reply "#{pod0} #{pod1}"
|
35
|
+
end
|
36
|
+
rescue
|
37
|
+
m.reply 'Unable to get a results'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
####
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# AutoLoad
|
46
|
+
Bot.config.plugins.plugins.push Plugins::Wolfram
|
File without changes
|
data/lib/Zeta/version.rb
ADDED
File without changes
|
File without changes
|
data/locale/en/8ball.yml
ADDED
File without changes
|
@@ -0,0 +1,148 @@
|
|
1
|
+
---
|
2
|
+
- rocket-punches <target> in the stomach!
|
3
|
+
- rocket-punches <target> in the groin!
|
4
|
+
- FALCON PAWNCHes <target>!
|
5
|
+
- stabs <target> repeatedly in the back with a nail gun, takes the nails out and pours salt into the holes from the nails, drives more nails in, then puts duct tape over the salt-and-nail-filled holes so <target> can't get them out!
|
6
|
+
- sends <target> flying into a brick wall!
|
7
|
+
- pierces <target> with a drill!
|
8
|
+
- shakes <target> like a idiot!
|
9
|
+
- swings <target> around like a idiot!
|
10
|
+
- hits <target> with a harisen!
|
11
|
+
- hits <target> with a mallet!
|
12
|
+
- bonks <target> on the head with a large hammer!
|
13
|
+
- smashes <target>'s head in with a large hammer!
|
14
|
+
- bonks <target> on the head with a pikopiko hammer!
|
15
|
+
- smashes <target>'s head in with a pikopiko hammer!
|
16
|
+
- takes a small computer from their belt, plugs in a dongle and scans its thumbprint. <bot> then inputs a few coordinates, and then taps something on it. Suddenly, a bright blue beam fires down from the sky, sending clouds circling around it. In a bright flash and a loud explosion, <target> is finally neutralized.
|
17
|
+
- attacks <target>'s life points directly!
|
18
|
+
- feeds <target> to sharks!
|
19
|
+
- forces <target> to watch the Super Bowl XLV halftime show Clockwork Orange style!
|
20
|
+
- deletes <target>!
|
21
|
+
- divides <target> by zero!
|
22
|
+
- hits <target> with a hammer!
|
23
|
+
- stabs <target> in the face with a combat knife!
|
24
|
+
- stabs <target> with a combat knife!
|
25
|
+
- kicks <target> in the face!
|
26
|
+
- uses DELTA KICK on <target>!
|
27
|
+
- piledrives <target>!
|
28
|
+
- piledrives <assailant>!
|
29
|
+
- piledrives <target>, and then <assailant>!
|
30
|
+
- rapes <target> with a burning candle!
|
31
|
+
- ties <target> up and drips them with a burning candle!
|
32
|
+
- ties <target> up and whacks them senseless with a pair of Shinai!
|
33
|
+
- throws <target> into a dark void!
|
34
|
+
- kicks <target> into a pit!
|
35
|
+
- forces <target> into a furry suit and then casts a fire spell!
|
36
|
+
- forces <target> into a furry suit and then puts them into a blender!
|
37
|
+
- puts <target> in a blender. Don't breathe this!
|
38
|
+
- metals out <target>!
|
39
|
+
- impales <target> with a commercial jet!
|
40
|
+
- throws <target> into a punji pit!
|
41
|
+
- smashes <target>'s face with a train!
|
42
|
+
- vores <target>!
|
43
|
+
- puts <target> into a rape tunnel!
|
44
|
+
- rapes <assailant>!
|
45
|
+
- rapes <assailant> with <target>!
|
46
|
+
- rapes <target> with <assailant>!
|
47
|
+
- punches <target>'s cunt til it bleeds!
|
48
|
+
- slaps <target> around a bit with a large trout!
|
49
|
+
- slaps <target> around a bit with a large magikarp!
|
50
|
+
- slaps <target> around a bit with a large sebmal!
|
51
|
+
- slaps <target> around a bit with a large <assailant>!
|
52
|
+
- slaps <assailant> around a bit with a large <target>!
|
53
|
+
- slaps <target> around with a large sandy vagina!
|
54
|
+
- rams a chainsaw through <target>'s face!
|
55
|
+
- throws <target> into a flaming pit of thermite!
|
56
|
+
- shoots <target> in the groin with a howitzer!
|
57
|
+
- gets <target> grappled by a Takoluka!
|
58
|
+
- ! "slaps <target> with a \x0304R\x0307A\x0308I\x0303N\x0302B\x0313O\x0306W\x03 trout!"
|
59
|
+
- blows the crap out of <target>!
|
60
|
+
- ends <target> with a Bonecrusher Mallet!
|
61
|
+
- glues <target>'s face to the wall!
|
62
|
+
- sends hordes of lemmings over <target>!
|
63
|
+
- throws a milkbag at <target>!
|
64
|
+
- throws 10 milkbags at <target>!
|
65
|
+
- throws 20 milkbags at <target>!
|
66
|
+
- throws 80 milkbags at <target>!
|
67
|
+
- throws 1,000,000 milkbags at <target>!
|
68
|
+
- turns <target> into a blue-haired loli with uncontrollable prehensile tentacle hair that attacks <assailant>!
|
69
|
+
- turns <assailant> into a blue-haired loli with uncontrollable prehensile tentacle hair that attacks <target>!
|
70
|
+
- becomes a blue-haired loli with prehensile tentacle hair and attacks <target>!
|
71
|
+
- becomes a blue-haired loli with prehensile tentacle hair and attacks <assailant>!
|
72
|
+
- becomes a blue-haired loli with prehensile tentacle hair and attacks <target> and <assailant>!
|
73
|
+
- slaps <target> around a bit with a 500lb C++ manual!
|
74
|
+
- slaps <target> around a bit with a large bonecrusher mallet!
|
75
|
+
- slaps <target> with a big-ass paddle!
|
76
|
+
- slaps <target> with a small Banana!
|
77
|
+
- slaps <target> with their very own hand!
|
78
|
+
- straps a bomb onto <target> and drops them off a plane!
|
79
|
+
- casts Expa Abyss on <target>!
|
80
|
+
- forces <target> into a tunafish costume and dunks them into the takoluka tank!
|
81
|
+
- pickles <target>!
|
82
|
+
- fucks <target> with a big splintering post!
|
83
|
+
- "forces <target> to play Big Rigs: Over The Road Racing all day long!"
|
84
|
+
- mind controls <target> and commands them to jump off a cliff!
|
85
|
+
- runs over <target> with a FULLY LOADED, 80,000 POUND TRACTOR TRAILER!
|
86
|
+
- shoots <target> with a BAR!
|
87
|
+
- shoots <target> with a Luger!
|
88
|
+
- shoots <target> with a Mauser HSc!
|
89
|
+
- shoots <target> with a DEAGLE BRAND DEAGLE!
|
90
|
+
- attempts to shoot <target> with an DEAGLE BRAND DEAGLE, but then it jams, and instead chucks it at <target>'s head, square on the forehead!
|
91
|
+
- shoots <target> with an MG-42!
|
92
|
+
- shoots <target> with an AR-15!
|
93
|
+
- shoots <target> with an AK-47!
|
94
|
+
- throws a Glock at <target> like a handgrenade!
|
95
|
+
- ties <target> onto an A6M and sends them on a kamikaze mission!
|
96
|
+
- performs SCIENCE on <target>!
|
97
|
+
- swings the butt end of an mg-42 at <target>!
|
98
|
+
- swings the butt end of an mg-42 at <assailant>!
|
99
|
+
- rams a rusty flathead screwdriver into <target>'s left eye socket!
|
100
|
+
- rams a rusty flathead screwdriver into <target>'s right eye socket!
|
101
|
+
- slaps <target> around a bit with a live lobster from a lobster trap. And then proceed to slap them with the lobster trap with even more live lobsters in it!
|
102
|
+
- slaps <assailant> around a bit with a live lobster from a lobster trap. And then proceed to slap them with the lobster trap with even more live lobsters in it!
|
103
|
+
- turns <target> into a l-- JESUS CHRIST IT'S A LION EVERYONE GET IN THE CAR!!!1!
|
104
|
+
- gives <target> rabies and death!
|
105
|
+
- runs a train through <target>'s soul!
|
106
|
+
- shoves a 19' diameter dildo up <target>'s ass!
|
107
|
+
- slaps <target> around with a large black rubber dildo!
|
108
|
+
- sears <target> with a flamethrower!
|
109
|
+
- pours scalding tea on <target>!
|
110
|
+
- takes <target> out to a romantic dinner and leaves them with the bill!
|
111
|
+
- exclaims, "I-it's n-not like I want to attack <target> or anything! Stupid!"
|
112
|
+
- calls <target> some very rude names!
|
113
|
+
- cancels <target>'s reservation to the Cheesecake Factory!
|
114
|
+
- kills <target> with fire!
|
115
|
+
- tells <target>'s mother what they did!
|
116
|
+
- makes <target> wish they were never born!
|
117
|
+
- ties up <target> in a storage unit and rapes them for eight hours on end.
|
118
|
+
- kills everyone on earth but <target> and then traps <target> in a cage.
|
119
|
+
- performs ξ( >◡❛)ξ▄︻▇▇〓〓 Tiro Finale! on <target>!
|
120
|
+
- ends <target> with a large burrito!
|
121
|
+
- impales <target> with a wooden effigy of Spongebob!
|
122
|
+
- punches <target>!
|
123
|
+
- kicks <target>!
|
124
|
+
- forces <target> to pull out their fingernails one... by... one.
|
125
|
+
- forcefully transforms <target> into Platinum The Trinity!
|
126
|
+
- fills every one of <target>'s orifaces with poutine!
|
127
|
+
- fists <target> in the ass!
|
128
|
+
- injects <target> with blue paint!
|
129
|
+
- makes <target> wear nothing but a navy uniform top and a blue school swimsuit for the whole day!
|
130
|
+
- makes <target> wear nothing but a navy uniform top and panties for the whole day!
|
131
|
+
- makes <target> wear nothing but a military uniform jacket and striped panties for the whole day!
|
132
|
+
- forces <target> wear nothing but a military uniform jacket and panties along with animal ears and tail for the whole day, and makes them exclaim "It's not panties so it's not embarassing!" every time someone asks them about it!
|
133
|
+
- makes <target> wear a schoolgirl uniform all day! (And puts a brown wig with twintails and pink bows on <target>, too.)
|
134
|
+
- takes photos of <target> in a school swimsuit!
|
135
|
+
- takes photos of <target> in a wet school swimsuit!
|
136
|
+
- takes photos of <target> and <assailant> in wet school swimsuits!
|
137
|
+
- takes photos of <target> and <assailant> in school swimsuits, and then <bot> sets the camera on a timer and gets in on the action, hugging (and secretly feels up) the two! Wee~!
|
138
|
+
- takes photos of <assailant> in a wet school swimsuit!
|
139
|
+
- gropes and molests <target>~
|
140
|
+
- punches <target> behind the cock!
|
141
|
+
- punches <target> in the dick!
|
142
|
+
- punches <target> in the colon!
|
143
|
+
- punches <target> in the bush!
|
144
|
+
- bizarro-supermans <target>!
|
145
|
+
- bites <target>'s hand.
|
146
|
+
- bites <assailant>'s hand.
|
147
|
+
- assassinates <target> with a sniper rifle from a high-up building.
|
148
|
+
- shoves a dragon dildo up <target>'s ass!
|