bankerbot-rb/coin.rb

221 lines
6.1 KiB
Ruby
Raw Normal View History

2022-10-07 15:12:06 +00:00
require 'dotenv/load'
require 'yaml'
require 'discordrb'
2023-02-14 11:22:15 +00:00
MAX_COINS_PER_DAY = 999
2022-10-07 15:12:06 +00:00
COIN_TIMEOUT = 15
SCOREBOARD = './scoreboard.yml'
2022-11-09 14:12:41 +00:00
PASTA='You know what? Im done, i am leaving, we were friendly talking about the subject. This crossed the line of "ok killer of joy" to "no fun allowed"'
2024-01-30 23:08:33 +00:00
ITEMS = ["manga", "ramen", "pizza", "a cum jar"]
2022-11-07 12:20:44 +00:00
COIN_EMOJI = '🪙'
2023-02-14 11:21:32 +00:00
BAG_EMOJI = '💰'
2022-11-09 14:12:41 +00:00
2023-05-08 14:57:51 +00:00
COIN_STATE_IDLE = 0
COIN_STATE_ACTIVE = 1
COIN_STATE_MATH = 2
MATH_PROBLEM_COIN_GAIN = 3
$coin_state_active = COIN_STATE_IDLE
2023-02-08 10:30:39 +00:00
$coins_offered_today = 0
2022-10-07 15:12:06 +00:00
2023-05-08 14:57:51 +00:00
$mathproblem_op1 = 0
$mathproblem_op2 = 0
$mathproblem_operator = "+"
2022-10-07 15:12:06 +00:00
bot = Discordrb::Bot.new token: ENV['DISCORD_TOKEN']
def get_seconds_to_midnight(time)
t2 = Time.new(time.year, time.month, time.day + 1)
return t2 - time
end
def get_random_hours(min, max)
min_hours = min * 60 * 60
max_hours = max * 60* 60
return rand(min_hours..max_hours)
2022-10-07 15:12:06 +00:00
end
def load_scoreboard()
YAML::load_file(SCOREBOARD) || {}
end
def get_coin_count(user)
scoreboard = load_scoreboard()
2022-10-07 15:12:06 +00:00
scoreboard[user] || 0
end
2022-10-11 14:14:09 +00:00
def increment_coin(user, amount=1)
2022-10-11 11:24:06 +00:00
scoreboard = load_scoreboard()
2022-10-11 14:14:09 +00:00
coins = get_coin_count(user) + amount
2022-10-07 15:12:06 +00:00
scoreboard[user] = coins
File.write(SCOREBOARD, scoreboard.to_yaml)
2022-10-11 14:14:09 +00:00
return coins
2022-10-07 15:12:06 +00:00
end
2022-10-11 11:24:06 +00:00
def empty_coin(user)
scoreboard = load_scoreboard()
scoreboard[user] = 0
File.write(SCOREBOARD, scoreboard.to_yaml)
end
2022-10-07 15:12:06 +00:00
def plural(string, count)
2022-10-07 18:50:01 +00:00
"#{count} #{string}#{count != 1 ? 's' : ''}"
2022-10-07 15:12:06 +00:00
end
def clean_name(input)
input.tr '@', ''
end
2023-05-08 14:57:51 +00:00
def get_coin(event, amt = 1)
2022-10-07 15:12:06 +00:00
# update score
2023-02-08 10:30:39 +00:00
author = event.methods.include?(:author) ? event.author : event.user
2023-05-09 21:39:12 +00:00
if $coin_state_active != 0
2023-02-08 10:30:39 +00:00
if author.bot_account?
2022-10-27 22:15:20 +00:00
event.respond "Bots don't get coins!"
end
2023-05-08 14:57:51 +00:00
$coin_state_active = COIN_STATE_IDLE
2022-10-27 22:15:20 +00:00
if(rand(100) == 47)
2022-10-11 14:14:09 +00:00
hyper_coin_amount = rand(100)
2024-01-30 23:08:33 +00:00
begin
coins = increment_coin(event.author.id, hyper_coin_amount)
rescue TypeError
event.respond "An error occured. Your data was most likely tampered with. SUCH A SHAME that you missed out on the HYPER COIN EVENT!1!! You could've had #{hyper_coin_amount} coins at once."
else
event.respond "What astounding luck!!! #{clean_name author.display_name}, you've just activated HYPER COIN EVENT and have received #{hyper_coin_amount} coins for a grand total of #{coins} coins!"
end
2022-10-11 14:14:09 +00:00
else
2024-01-30 23:08:33 +00:00
begin
coins = increment_coin(author.id, amt)
rescue TypeError
event.respond "An error occurred. Your data was most likely tampered with. I'm going to buy #{ITEMS.sample} with this money now!"
else
event.respond "Nice catch, #{clean_name author.display_name}! You have #{plural('coin', coins)} now!"
end
2022-10-11 14:14:09 +00:00
end
2022-10-07 15:12:06 +00:00
else
2023-02-08 10:30:39 +00:00
event.respond "No coins for you, #{clean_name author.display_name}!"
2022-10-07 15:12:06 +00:00
end
end
2023-02-08 10:30:39 +00:00
def give_coin(event)
reactor_coins = get_coin_count(event.user.id)
2023-02-24 23:10:24 +00:00
if reactor_coins <= 0
2023-02-08 10:30:39 +00:00
event.respond("Nice gesture, <@#{event.user.id}>, but you're broke! To get more coins, type the words `GET COIN` whenever I post the coin event message! But be quick, your friends are trying their best to get it before you do!")
return
end
if event.message.author == event.user
event.respond("<@#{event.user.id}>, you can't give coins to yourself!")
return
end
2023-02-14 11:21:32 +00:00
coin_amount = 0
if event.emoji.name == COIN_EMOJI
coin_amount = 1
elsif event.emoji.name == BAG_EMOJI
2023-02-14 11:24:22 +00:00
coin_amount = 5
2023-02-14 11:21:32 +00:00
end
2023-03-29 12:05:48 +00:00
if reactor_coins < coin_amount
coin_amount = reactor_coins
end
2023-02-14 11:21:32 +00:00
increment_coin(event.message.author.id, coin_amount)
increment_coin(event.user.id, -coin_amount)
2023-02-08 10:30:39 +00:00
2023-02-14 11:29:59 +00:00
event.respond "How nice! <@#{event.message.author.id}> has received #{plural('coin', coin_amount)} from <@#{event.user.id}>!"
2023-02-08 10:30:39 +00:00
end
bot.message(in: Integer(ENV['BOT_CHANNEL'])) do |event|
if event.message.attachments.count { |x| x.filename.scan(/coin*/).length > 0 } > 0
event.respond "Oh no! Looks like you tried to post a fradulent coin! #{clean_name event.author.display_name}, your coin balance has now been emptied. Let that be a lesson for next time!"
empty_coin(event.author.id)
end
end
bot.message(content: 'GET COIN' ) do |event|
get_coin(event)
end
2022-10-07 15:12:06 +00:00
bot.message(with_text: '/coins') do |event|
coins = get_coin_count(event.author.id)
event.respond "#{clean_name event.author.display_name}, you have #{plural('coin', coins)}!"
2022-10-07 15:12:06 +00:00
end
2022-11-09 14:12:41 +00:00
bot.message(with_text: '!leave') do |event|
event.respond PASTA
end
2023-01-26 16:33:15 +00:00
bot.message(with_text: 'boobs', in: Integer(ENV['CUM_CHANNEL'])) do |event|
2022-11-09 21:12:08 +00:00
next if not ENV['CUM_CHANNEL']
2023-05-19 08:47:38 +00:00
event.respond "# OHHHHHH IM GONNA CUM"
2022-11-09 21:12:08 +00:00
end
2022-11-07 12:20:44 +00:00
bot.reaction_add do |event|
2023-02-14 11:21:32 +00:00
next unless [COIN_EMOJI, BAG_EMOJI].include? event.emoji.name
2022-11-07 12:20:44 +00:00
2023-02-08 10:30:39 +00:00
if event.message.author.id == bot.bot_application.id
get_coin(event)
else
give_coin(event)
2022-11-07 12:20:44 +00:00
end
end
2023-05-08 14:57:51 +00:00
# math problem
bot.message(in: Integer(ENV['BOT_CHANNEL'])) do |event|
next unless $coin_state_active == COIN_STATE_MATH
result = eval("$mathproblem_op1 #{$mathproblem_operator} $mathproblem_op2")
user_result = Integer(event.message.content) rescue false
if result == user_result
get_coin(event, MATH_PROBLEM_COIN_GAIN)
2023-05-13 16:27:27 +00:00
elsif user_result.is_a? Integer
2023-05-08 14:57:51 +00:00
event.respond "Nice try, but you're wrong!"
end
end
2022-10-07 15:12:06 +00:00
bot.run(true)
2022-10-27 22:15:20 +00:00
loop do
# sleep random amount of time between 1 and 4 hours
sleep(get_random_hours(1, 4))
2023-05-08 14:57:51 +00:00
if rand(6) == 1
# math problem
# activate coin state
$coin_state_active = COIN_STATE_MATH
$mathproblem_op1 = rand(10..150)
$mathproblem_op2 = rand(10..150)
2023-05-08 15:01:51 +00:00
$mathproblem_operator = rand(2) == 1 ? "+" : "-"
2022-10-07 15:12:06 +00:00
2023-05-08 14:57:51 +00:00
# send the math problem
2023-05-09 11:38:32 +00:00
bot.send_file(ENV['BOT_CHANNEL'], File.open('./block.gif', 'r'))
2023-05-09 14:03:33 +00:00
bot.send_message(ENV['BOT_CHANNEL'], "Solve the following for #{MATH_PROBLEM_COIN_GAIN} coins: `#{$mathproblem_op1} #{$mathproblem_operator} #{$mathproblem_op2}`")
2023-05-08 14:57:51 +00:00
else
# activate coin state
$coin_state_active = COIN_STATE_ACTIVE
# send coin GIF
bot.send_file(ENV['BOT_CHANNEL'], File.open('./coin.gif', 'r'))
end
$coins_offered_today += 1
# if max coins per day has reached, sleep until midnight
2023-02-08 10:30:39 +00:00
if $coins_offered_today >= MAX_COINS_PER_DAY
sleep(get_seconds_to_midnight(Time.now))
2022-11-09 07:58:17 +00:00
sleep(get_random_hours(5, 11))
2023-02-08 10:30:39 +00:00
$coins_offered_today = 0
end
2022-10-07 15:12:06 +00:00
end
bot.join()