image.rb 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. require './app/models/carousels.rb'
  2. require './lib/emoji.rb'
  3. class ImageCarousel < Carousel
  4. def self.sections
  5. {
  6. Emoji::UNDO => 'back',
  7. Emoji::LEFT => 'left',
  8. Emoji::RIGHT => 'right'
  9. }
  10. end
  11. def self.update_embed(event, carousel)
  12. # Save reactions and determine section
  13. reactions = event.message.reactions
  14. direction = sections.filter{ |k,v| reactions[k]&.count.to_i > 1 }.values.first
  15. # Close if X is chosen
  16. return carousel.close(event) if reactions[Emoji::CROSS]&.count.to_i > 1
  17. case direction
  18. when 'back'
  19. # Find Image
  20. image = CharImage.find(carousel.image_id)
  21. character = Character.find(image.char_id)
  22. # Transition into a MemberCarousel
  23. event.message.delete_all_reactions
  24. CharacterCarousel.transition(event, carousel, character)
  25. when 'left', 'right'
  26. # Fetch the corresponding emoji, and remove non-bot reactions
  27. emoji = sections.key(direction)
  28. event.message.reacted_with(emoji).each do |r|
  29. event.message.delete_reaction(r.id, emoji) unless r.current_bot?
  30. end
  31. # Find image
  32. image = CharImage.find(carousel.image_id)
  33. new_image = ImageController.img_scroll(
  34. char_id: image.char_id,
  35. nsfw: event.channel.nsfw?,
  36. img: image.id,
  37. dir: direction.to_sym
  38. )
  39. # Update Carousel
  40. carousel.update(image_id: new_image&.id)
  41. # Update embed with new image
  42. BotResponse.new(
  43. carousel: carousel,
  44. embed: character_embed(
  45. character: Character.find(image.char_id),
  46. event: event,
  47. section: 'image',
  48. image: new_image
  49. )
  50. )
  51. end
  52. end
  53. def self.transition(event, carousel, character)
  54. # Find image ID
  55. image = CharImage.where(keyword: 'Default').find_by(char_id: character.id)
  56. # Update carousel to reflect new information
  57. carousel.update(
  58. char_id: nil,
  59. image_id: image&.id,
  60. landmark_id: nil,
  61. options: nil,
  62. journal_page: nil
  63. )
  64. # Update reply
  65. BotResponse.new(
  66. carousel: carousel,
  67. reactions: sections.map{ |k,v| k }.push(Emoji::CROSS),
  68. embed: character_embed(
  69. character: character,
  70. event: event,
  71. section: 'image'
  72. )
  73. )
  74. end
  75. end