zetabot 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +281 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +6 -0
  8. data/Zeta.gemspec +74 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +13 -0
  11. data/bin/zeta +9 -0
  12. data/bin/zeta-setup +13 -0
  13. data/lib/Zeta.rb +13 -0
  14. data/lib/Zeta/access.rb +84 -0
  15. data/lib/Zeta/admin.rb +10 -0
  16. data/lib/Zeta/admin/autojoin.rb +25 -0
  17. data/lib/Zeta/admin/bot.rb +43 -0
  18. data/lib/Zeta/admin/channels.rb +36 -0
  19. data/lib/Zeta/admin/eval.rb +43 -0
  20. data/lib/Zeta/admin/fifo.rb +45 -0
  21. data/lib/Zeta/admin/ignore.rb +112 -0
  22. data/lib/Zeta/admin/oper.rb +50 -0
  23. data/lib/Zeta/admin/plugins.rb +109 -0
  24. data/lib/Zeta/admin/users.rb +5 -0
  25. data/lib/Zeta/blacklist.rb +25 -0
  26. data/lib/Zeta/cache.rb +0 -0
  27. data/lib/Zeta/cinch.rb +35 -0
  28. data/lib/Zeta/config.rb +42 -0
  29. data/lib/Zeta/gems.rb +0 -0
  30. data/lib/Zeta/locale.rb +4 -0
  31. data/lib/Zeta/log.rb +2 -0
  32. data/lib/Zeta/models.rb +5 -0
  33. data/lib/Zeta/models/channel.rb +3 -0
  34. data/lib/Zeta/models/plugin.rb +3 -0
  35. data/lib/Zeta/models/user.rb +3 -0
  36. data/lib/Zeta/plugins.rb +27 -0
  37. data/lib/Zeta/plugins/attack.rb +61 -0
  38. data/lib/Zeta/plugins/botinfo.rb +83 -0
  39. data/lib/Zeta/plugins/darkscience.rb +215 -0
  40. data/lib/Zeta/plugins/dbz.rb +31 -0
  41. data/lib/Zeta/plugins/dcc.rb +25 -0
  42. data/lib/Zeta/plugins/dnsbl.rb +36 -0
  43. data/lib/Zeta/plugins/echo.rb +15 -0
  44. data/lib/Zeta/plugins/eightball.rb +53 -0
  45. data/lib/Zeta/plugins/fml.rb +35 -0
  46. data/lib/Zeta/plugins/fnord.rb +329 -0
  47. data/lib/Zeta/plugins/gem.rb +0 -0
  48. data/lib/Zeta/plugins/gif.rb +73 -0
  49. data/lib/Zeta/plugins/help.rb +32 -0
  50. data/lib/Zeta/plugins/libsecure.rb +34 -0
  51. data/lib/Zeta/plugins/macros.rb +124 -0
  52. data/lib/Zeta/plugins/movie.rb +67 -0
  53. data/lib/Zeta/plugins/pdfinfo.rb +69 -0
  54. data/lib/Zeta/plugins/rainbow.rb +65 -0
  55. data/lib/Zeta/plugins/russian_roulette.rb +90 -0
  56. data/lib/Zeta/plugins/seen.rb +77 -0
  57. data/lib/Zeta/plugins/silly.rb +183 -0
  58. data/lib/Zeta/plugins/snooper.rb +146 -0
  59. data/lib/Zeta/plugins/urban.rb +60 -0
  60. data/lib/Zeta/plugins/weather.rb +203 -0
  61. data/lib/Zeta/plugins/whois.rb +25 -0
  62. data/lib/Zeta/plugins/wiki.rb +75 -0
  63. data/lib/Zeta/plugins/wolfram.rb +46 -0
  64. data/lib/Zeta/tasks/db.rb +0 -0
  65. data/lib/Zeta/version.rb +3 -0
  66. data/lib/generators/config/config.rb +0 -0
  67. data/lib/generators/plugin/new_plugin.rb +0 -0
  68. data/locale/en/8ball.yml +0 -0
  69. data/locale/en/attack.yml +148 -0
  70. data/locale/en/dbz.yml +10 -0
  71. data/locale/en/ircop.yml +5 -0
  72. data/locale/en/macros.yml +98 -0
  73. data/locale/en/meme.yml +27 -0
  74. 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
@@ -0,0 +1,3 @@
1
+ module Zeta
2
+ VERSION = '0.0.1'
3
+ end
File without changes
File without changes
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!