bot.rb 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. require 'bundler'
  2. require 'erb'
  3. require 'yaml'
  4. require 'json'
  5. require 'terminal-table'
  6. require 'rmagick'
  7. require "down"
  8. BOT_ENV = ENV.fetch('BOT_ENV') { 'development' }
  9. Bundler.require(:default, BOT_ENV)
  10. require 'active_record'
  11. # Constants: such as roles and colors and regexes
  12. DISCORD = "#36393f"
  13. ERROR = "#a41e1f"
  14. UID = /<@\!?([0-9]+)>/
  15. # ---
  16. Dotenv.load if BOT_ENV != 'production'
  17. db_yml = File.open('config/database.yml') do |erb|
  18. ERB.new(erb.read).result
  19. end
  20. db_config = YAML.safe_load(db_yml)[BOT_ENV]
  21. ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
  22. ActiveRecord::Base.establish_connection(
  23. adapter: 'postgresql',
  24. host: db_config.fetch('host') { 'localhost' },
  25. database: db_config['database'],
  26. user: db_config['user'],
  27. password: db_config['password']
  28. )
  29. Dir['app/**/*.rb'].each { |f| require File.join(File.expand_path(__dir__), f) }
  30. Dir['./lib/*.rb'].each { |f| require f }
  31. token = ENV['DISCORD_BOT_TOKEN']
  32. bot = Discordrb::Bot.new(token: token)
  33. # Commands: structure basic bot commands here
  34. commands = []
  35. pm_commands = []
  36. hello = Command.new(:hello, "Says hello!") do |event|
  37. user = event.author.nickname || event.author.name
  38. img = Image.find_by(name: 'happy')
  39. greetings = [
  40. "Hi there, #{user}",
  41. "Greetings #{user}, you lovable bum",
  42. "Alola, #{user}",
  43. "Hello, #{user}! The Guildmasters have been waiting",
  44. "#{user} would like to battle!"
  45. ]
  46. Embed.new(
  47. description: greetings.sample,
  48. color: event.author.color.combined,
  49. thumbnail: {
  50. url: img.url
  51. }
  52. )
  53. end
  54. opts = {
  55. "" => "displays a list of all commands",
  56. "command" => "displays info and usage for specified command"
  57. }
  58. desc = "Displays help information for the commands"
  59. help = Command.new(:help, desc, opts) do |event, command|
  60. if command
  61. short = /pkmn-(\w+)/.match(command)
  62. command = short ? short[1] : command
  63. cmd = commands.detect { |c| c.name == command.to_sym }
  64. pm_cmd = pm_commands.detect { |pc| pc.name == command.to_sym }
  65. end
  66. if command && cmd
  67. command_embed(cmd)
  68. elsif command && pm_cmd
  69. command_embed(pm_cmd, "PM Command")
  70. elsif !command
  71. embed = command_list_embed(
  72. pm_commands,
  73. "Can only be used in a pm with the bot",
  74. "PM Commands"
  75. )
  76. event.send_embed("", embed)
  77. command_list_embed(commands)
  78. else
  79. command_error_embed("Command not found!", help)
  80. end
  81. end
  82. opts = {
  83. "primary" => "Single Display",
  84. "primary | secondary" => "Double Display"
  85. }
  86. desc = "Displays a chart of effectiveness for the given type"
  87. matchup = Command.new(:matchup, desc, opts) do |event, primary, secondary|
  88. channel = event.channel.id
  89. image_out = 'images/Type Double.png'
  90. file_p = "images/Type #{primary.capitalize}.png" if primary
  91. file_s = "images/Type #{secondary.capitalize}.png" if secondary
  92. case
  93. when !file_p
  94. command_error_embed("There was an error processing your request!", matchup)
  95. when !file_s && File.exists?(file_p)
  96. bot.send_file(channel, File.open(file_p, 'r'))
  97. when File.exists?(file_p) && File.exists?(file_s)
  98. append_image(file_p, file_s, image_out)
  99. bot.send_file(channel, File.open(image_out, 'r'))
  100. else
  101. error_embed("Type(s) not found!")
  102. end
  103. end
  104. opts = {
  105. "@user" => "List all user stats",
  106. }
  107. desc = "Shows ones stats, level, rank, and experience"
  108. stats = Command.new(:stats, desc, opts) do |event, name|
  109. case name
  110. when UID
  111. user_id = UID.match(name)
  112. user = event.server.member(user_id[1])
  113. user_url = user.avatar_url if user
  114. when String
  115. #See if you can find the name some other way?
  116. end
  117. channel = event.channel.id
  118. size_width = 570;
  119. size_height = 376;
  120. stats_frame = "images/LevelUp.png"
  121. level_up = "images/LevelUpFont.png"
  122. user_url_img = "images/Image_Builder/user_url_img.png"
  123. output_file = "images/Image_Builder/LevelUp"
  124. Down.download(user_url, destination: user_url_img)
  125. #Gif Destroyer
  126. i = Magick::ImageList.new(user_url_img)
  127. if(i.count > 1)
  128. i[0].write(user_url_img);
  129. end
  130. #End Gif Destroyer
  131. merge_image(
  132. [stats_frame, level_up, user_url_img],
  133. output_file,
  134. size_width,
  135. size_height,
  136. [nil, nil, 19],
  137. [nil, nil, 92],
  138. [size_width, size_width, 165],
  139. [size_height, size_height, 165]
  140. )
  141. # C# code for getting the percantage to the next level
  142. #int levelprior = LevelUp[task].NextLevel - (10 * (LevelUp[task].CurrentLevel - 1) ^ 2);
  143. #double ratio = (double)(LevelUp[task].Messages - levelprior) / (double)(LevelUp[task].NextLevel - levelprior);
  144. ratio = 0.5
  145. gc = Draw.new
  146. gc.font('OpenSans-SemiBold.ttf')
  147. gc.stroke('#39c4ff').fill('#39c4ff')
  148. gc.rectangle(42, 48, 42 + (95 * ratio), 48 + 3)
  149. gc.stroke('none').fill('black')
  150. gc.pointsize('15')
  151. name_sm = "Test Name 1"
  152. gc.text(15,25, name_sm)
  153. level = 'Lv.4'
  154. gc.text(40, 45, level)
  155. level_rank = 'Rank 104'
  156. gc.text(15, 290, level_rank)
  157. exp = '12340'
  158. gc.text(40, 65, exp)
  159. gc.stroke('white').fill('white')
  160. gc.pointsize('30')
  161. name_lg = "Test Name 2"
  162. gc.text(40,330, name_lg)
  163. reached = "reached level 4!"
  164. gc.text(40,360, reached)
  165. gc.stroke('none').fill('black')
  166. gc.pointsize('18')
  167. lvl_max_hp = '10'
  168. gc.text(450, 97, lvl_max_hp)
  169. lvl_atk = '11'
  170. gc.text(450, 127, lvl_atk)
  171. lvl_def = '12'
  172. gc.text(450, 159, lvl_def)
  173. lvl_sp_atk = '13'
  174. gc.text(450, 191, lvl_sp_atk)
  175. lvl_sp_def = '14'
  176. gc.text(450, 222, lvl_sp_def)
  177. lvl_speed = '15'
  178. gc.text(450, 255, lvl_speed)
  179. gc.stroke('none').fill('maroon')
  180. iv_max_hp = '+10'
  181. gc.text(505, 97, iv_max_hp)
  182. iv_atk = '+11'
  183. gc.text(505, 127, iv_atk)
  184. iv_def = '+12'
  185. gc.text(505, 159, iv_def)
  186. iv_sp_atk = '+13'
  187. gc.text(505, 191, iv_sp_atk)
  188. iv_sp_def = '+14'
  189. gc.text(505, 222, iv_sp_def)
  190. iv_speed = '+15'
  191. gc.text(505, 255, iv_speed)
  192. u = Magick::ImageList.new("#{output_file}.png")
  193. gc.draw(u[0])
  194. u.write("#{output_file}.png")
  195. msg = bot.send_file(channel, File.open("#{output_file}.png", 'r'))
  196. end
  197. opts = {
  198. "" => "starts a new app",
  199. "name" => "edits an existing app",
  200. "name | (in)active" => "sets app to active or inactive"
  201. }
  202. desc = "Everything to do with character applications"
  203. app = Command.new(:app, desc, opts) do |event, name, status|
  204. user = event.author
  205. user_name = user.nickname || user.name
  206. color = user.color.combined if user.color
  207. character = Character.where(user_id: user.id).find_by(name: name) if name
  208. active = status.match(/(in)?active/i) if status
  209. case
  210. when name && !character
  211. app_not_found_embed(user_name, name)
  212. when status && active && character
  213. character.update!(active: active[0].capitalize)
  214. character.reload
  215. success_embed("Successfully updated #{name} to be #{active[0].downcase}")
  216. when name && character && !status
  217. edit_url = Url::CHARACTER + character.edit_url
  218. embed = edit_app_dm(name, edit_url, color)
  219. bot.send_message(user.dm.id, "", false, embed)
  220. edit_app_embed(user_name, name, color)
  221. when !name && !status
  222. embed = new_app_dm(user_name, user.id, color)
  223. message = bot.send_message(user.dm.id, "", false, embed)
  224. message.react(Emoji::PHONE)
  225. new_app_embed(user_name, color)
  226. else
  227. command_error_embed("There was an error processing your application!", app)
  228. end
  229. end
  230. opts = { "question | option1, option2, etc" => ""}
  231. desc = "Creates a dynamic poll in any channel"
  232. poll = Command.new(:poll, desc, opts) do |event, question, options|
  233. if options
  234. options_array = options.split(/\s?,\s?/)
  235. new_poll_embed(event, question, options_array)
  236. else
  237. command_error_embed("There was an error creating your poll!", poll)
  238. end
  239. end
  240. opts = {
  241. "participants" =>
  242. "Accepts Everyone, Here, or a comma seperated list of names"
  243. }
  244. desc = "Creates a raffle and picks a winner"
  245. raffle = Command.new(:raffle, desc, opts) do |event, participant|
  246. participants =
  247. case participant
  248. when /^everyone$/i
  249. event.server.members
  250. when /^here$/i
  251. event.message.channel.users
  252. else
  253. participant.split(/\s?,\s?/)
  254. end
  255. winner = participants.sample
  256. winner_name =
  257. case winner
  258. when String
  259. winner
  260. else
  261. winner.nickname || winner.username
  262. end
  263. if winner_name
  264. message_embed("Raffle Results!", "Winner: #{winner_name}")
  265. else
  266. command_error_embed("There was an error creating your raffle!", raffle)
  267. end
  268. end
  269. opts = {
  270. "name | keyword | (n)sfw | url" => "add or update image",
  271. "name | keyword | delete" => "remove image",
  272. "name | keyword" => "display image",
  273. "name" => "list all images"
  274. }
  275. desc = "View, add and edit your characters' images"
  276. image = Command.new(:image, desc, opts) do |event, name, keyword, tag, url|
  277. user = event.author
  278. char = Character.where(user_id: user.id).find_by!(name: name) if name
  279. color = CharacterController.type_color(char) if char
  280. img = CharImage.where(char_id: char.id).find_by(keyword: keyword) if keyword
  281. case
  282. when /^Default$/i.match(keyword)
  283. error_embed(
  284. "Cannot update Default here!",
  285. "Use `pkmn-app character` to edit your default image in your form"
  286. )
  287. when char && keyword && url && tag && tag.match(/(n)?sfw/i)
  288. img_app = CharImage.to_form(
  289. char: char,
  290. keyword: keyword,
  291. category: tag,
  292. url: url,
  293. user_id: user.id
  294. )
  295. approval = bot.send_message(ENV['APP_CH'].to_i, "", false, img_app)
  296. approval.react(Emoji::Y)
  297. approval.react(Emoji::N)
  298. success_embed("Your image has been submitted for approval!")
  299. when char && img && tag && tag.match(/delete/i)
  300. CharImage.find(img.id).delete
  301. success_embed("Removed image: #{keyword}")
  302. when char && img && !tag
  303. char_image_embed(char, img, user, color)
  304. when char && !keyword
  305. imgs = CharImage.where(char_id: char.id)
  306. image_list_embed(char, imgs, user, color)
  307. when keyword && !img
  308. error_embed("Could not find your image!")
  309. else
  310. command_error_embed("Could not process your image request!", image)
  311. end
  312. rescue ActiveRecord::RecordNotFound
  313. error_embed(
  314. "Character not Found!",
  315. "I could not find your character named #{name}"
  316. )
  317. end
  318. opts = {
  319. "" => "List all guild members",
  320. "@user" => "List all characters belonging to the user",
  321. "name " => "Display the given character",
  322. "name | section" => "Display the given section for the character",
  323. "name | image | keword" => "Display the given image"
  324. }
  325. desc = "Display info about the guild members"
  326. member = Command.new(:member, desc, opts) do |event, name, section, keyword|
  327. sections = [:all, :default, :bio, :type, :status, :rumors, :image, :bags]
  328. case name
  329. when UID
  330. user_id = UID.match(name)
  331. when String
  332. chars = Character.where(name: name)
  333. char = chars.first if chars.length == 1
  334. if char
  335. img = CharImage.where(char_id: char.id).find_by(keyword: 'Default')
  336. user = event.server.member(char.user_id)
  337. color = CharacterController.type_color(char)
  338. end
  339. end
  340. case
  341. when !name
  342. chars = Character.all
  343. char_list_embed(chars)
  344. when name && user_id
  345. chars = Character.where(user_id: user_id[1])
  346. user = event.server.member(user_id[1])
  347. chars_id = []
  348. chars.each do |char|
  349. chars_id.push char.id if char.active == 'Active'
  350. end
  351. embed = user_char_embed(chars, user)
  352. msg = event.send_embed("", embed)
  353. Carousel.create(message_id: msg.id, options: chars_id)
  354. option_react(msg, chars_id)
  355. when name && chars.empty?
  356. error_embed(
  357. "Character not found!",
  358. "Could not find a character named #{name}"
  359. )
  360. when name && chars && !char
  361. embed = dup_char_embed(chars, name)
  362. chars_id = chars.map(&:id)
  363. msg = event.send_embed("", embed)
  364. Carousel.create(message_id: msg.id, options: chars_id)
  365. option_react(msg, chars_id)
  366. when name && char && !section
  367. embed = character_embed(
  368. char: char,
  369. img: img,
  370. section: :default,
  371. user: user,
  372. color: color
  373. )
  374. msg = event.send_embed("", embed)
  375. Carousel.create(message_id: msg.id, char_id: char.id)
  376. section_react(msg)
  377. when char && section && keyword
  378. embed = command_error_embed(
  379. "Invalid Arguments",
  380. member
  381. )unless /image/i.match(section)
  382. unless embed
  383. img = CharImage.where(char_id: char.id).find_by!(keyword: keyword)
  384. embed = error_embed(
  385. "Wrong Channel!",
  386. "The requested image is NSFW"
  387. )if img.category == 'NSFW' && !event.channel.nsfw?
  388. end
  389. unless embed
  390. embed = character_embed(
  391. char: char,
  392. img: img,
  393. section: :image,
  394. user: user,
  395. color: color
  396. )
  397. msg = event.send_embed("", embed)
  398. Carousel.create(message_id: msg.id, char_id: char.id, image_id: img.id)
  399. arrow_react(msg)
  400. end
  401. embed
  402. when name && char && section
  403. sect = section.downcase.to_sym
  404. nsfw = event.channel.nsfw?
  405. img = ImageController.img_scroll(
  406. char_id: char.id,
  407. nsfw: nsfw
  408. )if section == :image
  409. if sections.detect{ |s| s == sect }
  410. embed = character_embed(
  411. char: char,
  412. img: img,
  413. section: sect,
  414. user: user,
  415. color: color,
  416. )
  417. msg = event.send_embed("", embed)
  418. Carousel.create(message_id: msg.id, char_id: char.id, image_id: img.id)
  419. if sect == :image
  420. arrow_react(msg)
  421. else
  422. section_react(msg)
  423. end
  424. else
  425. error_embed("Invalid Section!")
  426. end
  427. end
  428. rescue ActiveRecord::RecordNotFound => e
  429. error_embed("Record Not Found!", e.message)
  430. end
  431. item = Command.new(:item, desc, opts) do |event, name|
  432. i = name ? Item.find_by!(name: name.capitalize) : Item.all
  433. case
  434. when name && i
  435. item_embed(i)
  436. when !name && i
  437. item_list_embed(i)
  438. else
  439. command_error_embed("Error proccessing your request!", item)
  440. end
  441. rescue ActiveRecord::RecordNotFound
  442. error_embed("Item Not Found!")
  443. end
  444. desc = "Add and remove items from characters' inventories"
  445. opts = { "item | (-/+) amount | character" => "" }
  446. inv = Command.new(:inv, desc, opts) do |event, item, amount, name|
  447. char = Character.find_by!(name: name) if name
  448. itm = Item.find_by!(name: item) if item
  449. amt = amount.to_i
  450. case
  451. when char && itm && amt
  452. i = Inventory.update_inv(itm, amt, char)
  453. user = event.server.member(char.user_id.to_i)
  454. color = CharacterController.type_color(char)
  455. case i
  456. when Inventory, true
  457. character_embed(char: char, user: user, color: color, section: :bags)
  458. when Embed
  459. i
  460. else
  461. error_embed("Something went wrong!", "Could not update inventory")
  462. end
  463. else
  464. command_error_embed("Could not proccess your request", inv)
  465. end
  466. rescue ActiveRecord::RecordNotFound => e
  467. error_embed(e.message)
  468. end
  469. # ---
  470. commands = [
  471. hello,
  472. matchup,
  473. app,
  474. help,
  475. poll,
  476. raffle,
  477. member,
  478. item,
  479. inv,
  480. stats
  481. ]
  482. locked_commands = [inv]
  483. # This will trigger on every message sent in discord
  484. bot.message do |event|
  485. content = event.message.content
  486. author = event.author.id
  487. command = /^pkmn-(\w+)/.match(content)
  488. cmd = commands.detect { |c| c.name == command[1].to_sym } if command
  489. reply = cmd.call(content, event) if cmd
  490. case reply
  491. when Embed
  492. event.send_embed("", reply)
  493. when String
  494. event.respond(reply)
  495. end
  496. event.send_embed(
  497. "",
  498. error_embed("Command not found!")
  499. )if command && !cmd && event.server
  500. if author == ENV['WEBHOOK'].to_i
  501. app = event.message.embeds.first
  502. if app.author.name == 'Character Application'
  503. Character.check_user(event)
  504. else
  505. approval_react(event)
  506. end
  507. end
  508. end
  509. pm_commands = [ image ]
  510. # This will trigger when a dm is sent to the bot from a user
  511. bot.pm do |event|
  512. content = event.message.content
  513. command = /^pkmn-(\w+)/.match(content)
  514. cmd = pm_commands.detect { |c| c.name == command[1].to_sym } if command
  515. reply = cmd.call(content, event) if cmd
  516. case reply
  517. when Embed
  518. event.send_embed("", reply)
  519. when String
  520. event.respond(reply)
  521. end
  522. end
  523. # This will trigger when any reaction is added in discord
  524. bot.reaction_add do |event|
  525. reactions = event.message.reactions
  526. app = event.message.embeds.first
  527. carousel = Carousel.find_by(message_id: event.message.id)
  528. app = event.message.embeds.first
  529. carousel = Carousel.find_by(message_id: event.message.id)
  530. carousel = Carousel.find_by(message_id: event.message.id)
  531. maj =
  532. if event.server
  533. m = event.server.roles.find{ |r| r.id == ENV['ADMINS'].to_i }.members
  534. m.count / 2
  535. end
  536. maj = 1
  537. form =
  538. case app.author&.name
  539. when 'New App' then :new_app
  540. when 'Character Application' then :character_application
  541. when 'Character Rejection' then :character_rejection
  542. when 'Image Application' then :image_application
  543. when 'Image Rejection' then :image_rejection
  544. when 'Item Application' then :item_application
  545. when 'Item Rejection' then :item_rejection
  546. else
  547. :carousel if carousel
  548. end
  549. vote =
  550. case
  551. when reactions[Emoji::Y]&.count.to_i > maj then :yes
  552. when reactions[Emoji::N]&.count.to_i > maj then :no
  553. when reactions[Emoji::CHECK]&.count.to_i > 1 then :check
  554. when reactions[Emoji::CROSS]&.count.to_i > 1 then :cross
  555. when reactions[Emoji::CRAYON]&.count.to_i > 1 then :crayon
  556. when reactions[Emoji::NOTEBOOK]&.count.to_i > 1 then :notebook
  557. when reactions[Emoji::QUESTION]&.count.to_i > 1 then :question
  558. when reactions[Emoji::PALLET]&.count.to_i > 1 then :pallet
  559. when reactions[Emoji::EAR]&.count.to_i > 1 then :ear
  560. when reactions[Emoji::PICTURE]&.count.to_i > 1 then :picture
  561. when reactions[Emoji::BAGS]&.count.to_i > 1 then :bags
  562. when reactions[Emoji::FAMILY]&.count.to_i > 1 then :family
  563. when reactions[Emoji::EYES]&.count.to_i > 1 then :eyes
  564. when reactions[Emoji::KEY]&.count.to_i > 1 then :key
  565. when reactions[Emoji::PHONE]&.count.to_i > 1 then :phone
  566. when reactions[Emoji::LEFT]&.count.to_i > 1 then :left
  567. when reactions[Emoji::RIGHT]&.count.to_i > 1 then :right
  568. when reactions[Emoji::UNDO]&.count.to_i > 1 then :back
  569. when reactions.any? { |k,v| Emoji::NUMBERS.include? k } then :number
  570. end
  571. case [form, vote]
  572. when [:character_application, :yes]
  573. uid = UID.match(app.description)
  574. user = event.server.member(uid[1])
  575. char = CharacterController.edit_character(app)
  576. img = ImageController.default_image(app.thumbnail.url, char.id)
  577. color = CharacterController.type_color(char)
  578. embed = character_embed(
  579. char: char,
  580. img: img,
  581. user: user,
  582. color: color
  583. )if char
  584. if embed
  585. bot.send_message(
  586. ENV['CHAR_CH'].to_i,
  587. "Good news, <@#{uid}>! Your character was approved",
  588. false,
  589. embed
  590. )
  591. event.message.delete
  592. else
  593. event.respond(
  594. "",
  595. admin_error_embed("Something went wrong when saving application")
  596. )
  597. end
  598. when [:character_application, :no]
  599. embed = reject_app_embed(app, :character)
  600. event.message.delete
  601. reject = event.send_embed("", embed)
  602. Emoji::CHAR_APP.each do |reaction|
  603. reject.react(reaction)
  604. end
  605. reject.react(Emoji::CHECK)
  606. reject.react(Emoji::CROSS)
  607. reject.react(Emoji::CRAYON)
  608. when [:character_rejection, :check]
  609. user = event.server.member(UID.match(app.description)[1])
  610. embed = user_char_app(event)
  611. event.message.delete
  612. bot.send_temporary_message(event.channel.id, "", 5, false, embed)
  613. bot.send_message(user.dm.id, "", false, embed)
  614. when [:character_rejection, :cross]
  615. event.message.delete
  616. when [:character_rejection, :crayon]
  617. event.message.delete
  618. bot.send_temporary_message(
  619. event.channel.id,
  620. "",
  621. 35,
  622. false,
  623. self_edit_embed(app, URL::CHARACTER)
  624. )
  625. when [:new_app, :phone]
  626. event.message.delete_own_reaction(Emoji::PHONE)
  627. user = event.message.reacted_with(Emoji::PHONE).first
  628. bot.send_message(user.dm.id, user.id, false, nil)
  629. when [:image_application, :yes]
  630. img = ImageController.edit_image(app)
  631. char = Character.find(img.char_id)
  632. user = event.server.member(char.user_id)
  633. color = CharacterController.type_color(char)
  634. embed = char_image_embed(char, img, user, color)
  635. event.message.delete if embed
  636. channel = if img.category == 'SFW'
  637. ENV['CHAR_CH'].to_i
  638. else
  639. ENV['CHAR_CH_NSFW'].to_i
  640. end
  641. bot.send_message(channel, "Image Approved!", false, embed)
  642. when [:image_application, :no]
  643. embed = reject_app_embed(app, :image)
  644. event.message.delete
  645. reject = event.send_embed("", embed)
  646. Emoji::IMG_APP.each do |reaction|
  647. reject.react(reaction)
  648. end
  649. reject.react(Emoji::CHECK)
  650. reject.react(Emoji::CROSS)
  651. when [:image_rejection, :check]
  652. user = event.server.member(UID.match(app.description)[1])
  653. embed = user_img_app(event)
  654. event.message.delete
  655. bot.send_temporary_message(event.channel.id, "", 5, false, embed)
  656. bot.send_message(user.dm.id, "", false, embed)
  657. when [:image_rejection, :cross]
  658. event.message.delete
  659. when [:item_application, :yes]
  660. item = ItemController.edit_item(app)
  661. embed = item_embed(item)
  662. event.message.delete
  663. bot.send_message(ENV['CHAR_CH'], "New Item!", false, embed)
  664. when [:item_application, :no]
  665. embed = reject_app_embed(app)
  666. event.message.delete
  667. reject = event.send_embed("", embed)
  668. reject.react(Emoji::CRAYON)
  669. reject.react(Emoji::CROSS)
  670. when [:item_rejection, :crayon]
  671. embed = self_edit_embed(app, Url::ITEM)
  672. event.message.delete
  673. bot.send_temporary_message(event.channel.id, "", 25, false, embed)
  674. when [:item_rejection, :cross]
  675. event.message.delete
  676. when [:carousel, :notebook]
  677. emoji = Emoji::NOTEBOOK
  678. users = event.message.reacted_with(emoji)
  679. users.each do |user|
  680. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  681. end
  682. char = Character.find(carousel.char_id)
  683. embed = character_embed(
  684. char: char,
  685. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  686. user: event.server.member(char.user_id),
  687. color: CharacterController.type_color(char),
  688. section: :bio
  689. )
  690. event.message.edit("", embed)
  691. when [:carousel, :question]
  692. emoji = Emoji::QUESTION
  693. users = event.message.reacted_with(emoji)
  694. users.each do |user|
  695. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  696. end
  697. char = Character.find(carousel.char_id)
  698. embed = character_embed(
  699. char: char,
  700. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  701. user: event.server.member(char.user_id),
  702. color: CharacterController.type_color(char),
  703. section: :status
  704. )
  705. event.message.edit("", embed)
  706. when [:carousel, :pallet]
  707. emoji = Emoji::PALLET
  708. users = event.message.reacted_with(emoji)
  709. users.each do |user|
  710. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  711. end
  712. char = Character.find(carousel.char_id)
  713. embed = character_embed(
  714. char: char,
  715. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  716. user: event.server.member(char.user_id),
  717. color: CharacterController.type_color(char),
  718. section: :type
  719. )
  720. event.message.edit("", embed)
  721. when [:carousel, :ear]
  722. emoji = Emoji::EAR
  723. users = event.message.reacted_with(emoji)
  724. users.each do |user|
  725. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  726. end
  727. char = Character.find(carousel.char_id)
  728. embed = character_embed(
  729. char: char,
  730. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  731. user: event.server.member(char.user_id),
  732. color: CharacterController.type_color(char),
  733. section: :rumors
  734. )
  735. event.message.edit("", embed)
  736. when [:carousel, :picture]
  737. event.message.delete_all_reactions
  738. char = Character.find(carousel.char_id)
  739. img = ImageController.img_scroll(
  740. char_id: char.id,
  741. nsfw: event.channel.nsfw?,
  742. )
  743. carousel.update(id: carousel.id, image_id: img.id)
  744. embed = character_embed(
  745. char: char,
  746. img: img,
  747. user: event.server.member(char.user_id),
  748. color: CharacterController.type_color(char),
  749. section: :image
  750. )
  751. event.message.edit("", embed)
  752. arrow_react(event.message)
  753. when [:carousel, :bags]
  754. emoji = Emoji::BAGS
  755. users = event.message.reacted_with(emoji)
  756. users.each do |user|
  757. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  758. end
  759. char = Character.find(carousel.char_id)
  760. embed = character_embed(
  761. char: char,
  762. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  763. user: event.server.member(char.user_id),
  764. color: CharacterController.type_color(char),
  765. section: :bags
  766. )
  767. event.message.edit("", embed)
  768. when [:carousel, :family]
  769. when [:carousel, :eyes]
  770. emoji = Emoji::EYES
  771. users = event.message.reacted_with(emoji)
  772. users.each do |user|
  773. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  774. end
  775. char = Character.find(carousel.char_id)
  776. embed = character_embed(
  777. char: char,
  778. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  779. user: event.server.member(char.user_id),
  780. color: CharacterController.type_color(char),
  781. section: :all
  782. )
  783. event.message.edit("", embed)
  784. when [:carousel, :key]
  785. emoji = Emoji::KEY
  786. users = event.message.reacted_with(emoji)
  787. users.each do |user|
  788. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  789. end
  790. char = Character.find(carousel.char_id)
  791. embed = character_embed(
  792. char: char,
  793. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  794. user: event.server.member(char.user_id),
  795. color: CharacterController.type_color(char),
  796. section: :default
  797. )
  798. event.message.edit("", embed)
  799. when [:carousel, :back]
  800. event.message.delete_all_reactions
  801. char = Character.find(carousel.char_id)
  802. embed = character_embed(
  803. char: char,
  804. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  805. user: event.server.member(char.user_id),
  806. color: CharacterController.type_color(char),
  807. section: :default
  808. )
  809. event.message.edit("", embed)
  810. section_react(event.message)
  811. when [:carousel, :left], [:carousel, :right]
  812. emoji = vote == :left ? Emoji::LEFT : Emoji::RIGHT
  813. users = event.message.reacted_with(emoji)
  814. users.each do |user|
  815. event.message.delete_reaction(user.id, emoji) unless user.current_bot?
  816. end
  817. char = Character.find(carousel.char_id)
  818. img = ImageController.img_scroll(
  819. char_id: char.id,
  820. nsfw: event.channel.nsfw?,
  821. img: carousel.image_id,
  822. dir: vote
  823. )
  824. carousel.update(id: carousel.id, image_id: img.id)
  825. embed = character_embed(
  826. char: char,
  827. img: img,
  828. user: event.server.member(char.user_id),
  829. color: CharacterController.type_color(char),
  830. section: :image
  831. )
  832. event.message.edit("", embed)
  833. when [:carousel, :number]
  834. char_index = nil
  835. Emoji::NUMBERS.each.with_index do |emoji, i|
  836. char_index = i if reactions[emoji]&.count.to_i > 1
  837. end
  838. if char_index
  839. event.message.delete_all_reactions
  840. char = Character.find(carousel.options[char_index])
  841. carousel.update(id: carousel.id, char_id: char.id)
  842. embed = character_embed(
  843. char: char,
  844. img: CharImage.where(char_id: char.id).find_by(keyword: 'Default'),
  845. user: event.server.member(char.user_id),
  846. color: CharacterController.type_color(char),
  847. section: :default
  848. )
  849. event.message.edit("", embed)
  850. section_react(event.message)
  851. end
  852. when [:carousel, :cross]
  853. event.message.delete
  854. carousel.delete
  855. end
  856. end
  857. # This will trigger when any reaction is removed in discord
  858. bot.reaction_remove do |event|
  859. end
  860. # This will trigger when a member is updated
  861. bot.member_update do |event|
  862. end
  863. # This will trigger when anyone joins the server
  864. bot.member_join do |event|
  865. end
  866. # This will trigger when anyone leaves the server
  867. bot.member_leave do |event|
  868. end
  869. # This will trigger when anyone is banned from the server
  870. bot.user_ban do |event|
  871. end
  872. # This will trigger when anyone is un-banned from the server
  873. bot.user_unban do |event|
  874. end
  875. bot.run