ogs_katacheck 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +8 -0
 - data/CHANGELOG.md +4 -0
 - data/Gemfile +8 -0
 - data/README.md +37 -0
 - data/Rakefile +2 -0
 - data/bin/console +14 -0
 - data/bin/ogs-katacheck +5 -0
 - data/bin/setup +8 -0
 - data/lib/ogs_katacheck.rb +7 -0
 - data/lib/ogs_katacheck/cli.rb +58 -0
 - data/lib/ogs_katacheck/full_review.rb +70 -0
 - data/lib/ogs_katacheck/review.rb +49 -0
 - data/lib/ogs_katacheck/version.rb +3 -0
 - data/ogs_katacheck.gemspec +28 -0
 - metadata +61 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1aab2ad84305b247e1322ca044945c54f70b791018335241fad5dd84dd366334
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d27f633ba9711c8919dbd31a3804894223d8abe580fe038b4fada757f0c74690
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 319fb6ca517da68aa5b239df2d2549104f2e3908fdcc2c3e022d635806db2f1b0db7967494b623f43f8b25d86803718bcee0df27a1bf9996dd5889875963472f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: af2912f11d6146ded07656e729540a565ad06313131b3442aa67a553cb968139447d2d56e1ac621270655c58f421ed17c0bb66682b88be3574cddb46d19feb3d
         
     | 
    
        data/.gitignore
    ADDED
    
    
    
        data/CHANGELOG.md
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # OGS KataCheck
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            This CLI gem is intended to aid OGS team members in the investigation of suspected AI cheaters.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            It pulls game information from the OGS API and checks the user submitted moves against full reviews run on the game.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            You will need to have Ruby installed on your machine to run this CLI. If you are using a Mac, this is already done for you. If on a Windows machine you can install it by following [these instructions](https://stackify.com/install-ruby-on-windows-everything-you-need-to-get-going/).
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            To install this Gem, open a terminal and run:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                $ gem install ogs_katacheck
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            After installing OGS KataCheck, you can run it by opening a terminal and typing:
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                $ ogs-katacheck
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            You will be asked to enter a game ID. This can be simply copied and pasted from OGS.
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            You will then be presented with a list of available OGS AI reviews. **Only full reviews** are useable with this tool.  If you do not see a full review in the list, open the game in OGS and run a full review. Once the server has completed the review, re-run the tool.
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            The tool will output the number of user submitted moves that match the top 4 moves suggested by the AI in the review. Obviously, `tier 1` and `tier 2` moves are most important to look at, but the overall percentages can also be helpful.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            ***Note:** A high percentage match in a game does not necessarily mean the user is cheating, but high percentage matches across many games will certainly warrant further investigation.*
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ## Development
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            Bug reports and pull requests are welcome on GitHub at https://github.com/rubymineshaft/ogs_katacheck.
         
     | 
    
        data/Rakefile
    ADDED
    
    
    
        data/bin/console
    ADDED
    
    | 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "bundler/setup"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "ogs_katacheck"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # You can add fixtures and/or initialization code here to make experimenting
         
     | 
| 
      
 7 
     | 
    
         
            +
            # with your gem easier. You can also use a different console, if you like.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            # (If you use this, don't forget to add pry to your Gemfile!)
         
     | 
| 
      
 10 
     | 
    
         
            +
            # require "pry"
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Pry.start
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            require "irb"
         
     | 
| 
      
 14 
     | 
    
         
            +
            IRB.start(__FILE__)
         
     | 
    
        data/bin/ogs-katacheck
    ADDED
    
    
    
        data/bin/setup
    ADDED
    
    
| 
         @@ -0,0 +1,58 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class OGSKataCheck::CLI
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              def call
         
     | 
| 
      
 4 
     | 
    
         
            +
                puts "Enter the Game ID you'd like to check for AI use:"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                game_id = gets.strip
         
     | 
| 
      
 7 
     | 
    
         
            +
                get_reviews(game_id)
         
     | 
| 
      
 8 
     | 
    
         
            +
                show_review_menu(game_id)
         
     | 
| 
      
 9 
     | 
    
         
            +
                check_id = gets.strip.to_i
         
     | 
| 
      
 10 
     | 
    
         
            +
                check(check_id)
         
     | 
| 
      
 11 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 12 
     | 
    
         
            +
                puts "Check another game? (Y/N)"
         
     | 
| 
      
 13 
     | 
    
         
            +
                input = gets.strip.downcase
         
     | 
| 
      
 14 
     | 
    
         
            +
                if input == "y"
         
     | 
| 
      
 15 
     | 
    
         
            +
                  Review.destroy_all
         
     | 
| 
      
 16 
     | 
    
         
            +
                  FullReview.destroy_all
         
     | 
| 
      
 17 
     | 
    
         
            +
                  call
         
     | 
| 
      
 18 
     | 
    
         
            +
                else
         
     | 
| 
      
 19 
     | 
    
         
            +
                  show_farewell
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def get_reviews(game_id)
         
     | 
| 
      
 24 
     | 
    
         
            +
                response = Faraday.get "https://online-go.com/api/v1/games/#{game_id}/ai_reviews"
         
     | 
| 
      
 25 
     | 
    
         
            +
                data = JSON.parse(response.body)
         
     | 
| 
      
 26 
     | 
    
         
            +
                data.each_with_index do |review, index|
         
     | 
| 
      
 27 
     | 
    
         
            +
                  Review.new(review, number: index + 1)
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              def show_review_menu(game_id)
         
     | 
| 
      
 33 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 34 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 35 
     | 
    
         
            +
                puts "Game ID: #{game_id}"
         
     | 
| 
      
 36 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 37 
     | 
    
         
            +
                puts "The following reviews are available:"
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                Review.all.each do |review|
         
     | 
| 
      
 40 
     | 
    
         
            +
                  puts "#{review.number}.  #{review.id} - #{review.engine} - #{review.type} - #{review.date}"
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 44 
     | 
    
         
            +
                puts "Enter the number of a review to check:"
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              def check(check_id)
         
     | 
| 
      
 49 
     | 
    
         
            +
                puts "Processing. Please wait..."
         
     | 
| 
      
 50 
     | 
    
         
            +
                review = Review.find_by_number(check_id)
         
     | 
| 
      
 51 
     | 
    
         
            +
                review.check
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              def show_farewell
         
     | 
| 
      
 55 
     | 
    
         
            +
                puts "Goodbye!"
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class FullReview
         
     | 
| 
      
 2 
     | 
    
         
            +
              attr_accessor :win_rates, :scores, :id, :type, :game_id, :engine, :engine_version, :network, :network_size, :date, :strength, :win_rate, :moves,
         
     | 
| 
      
 3 
     | 
    
         
            +
                :total_moves, :black_tier_1, :black_tier_2, :black_tier_3, :black_tier_4, :white_tier_1, :white_tier_2, :white_tier_3, :white_tier_4, :black_total, :white_total
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              @@all = []
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def initialize(attributes)
         
     | 
| 
      
 8 
     | 
    
         
            +
                attributes.each {|key, value| self.send(("#{key}="), value)}
         
     | 
| 
      
 9 
     | 
    
         
            +
                @black_tier_1 = [0, 0]
         
     | 
| 
      
 10 
     | 
    
         
            +
                @black_tier_2 = [0, 0]
         
     | 
| 
      
 11 
     | 
    
         
            +
                @black_tier_3 = [0, 0]
         
     | 
| 
      
 12 
     | 
    
         
            +
                @black_tier_4 = [0, 0]
         
     | 
| 
      
 13 
     | 
    
         
            +
                @black_total = [0, 0]
         
     | 
| 
      
 14 
     | 
    
         
            +
                @white_total = [0, 0]
         
     | 
| 
      
 15 
     | 
    
         
            +
                @white_tier_1 = [0, 0]
         
     | 
| 
      
 16 
     | 
    
         
            +
                @white_tier_2 = [0, 0]
         
     | 
| 
      
 17 
     | 
    
         
            +
                @white_tier_3 = [0, 0]
         
     | 
| 
      
 18 
     | 
    
         
            +
                @white_tier_4 = [0, 0]
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                @@all << self
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def self.all
         
     | 
| 
      
 24 
     | 
    
         
            +
                @@all
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              def self.destroy_all
         
     | 
| 
      
 28 
     | 
    
         
            +
                self.all.clear 
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              def calculate_percentages
         
     | 
| 
      
 32 
     | 
    
         
            +
                @black_tier_1[1] = @black_tier_1[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 33 
     | 
    
         
            +
                @black_tier_2[1] = @black_tier_2[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 34 
     | 
    
         
            +
                @black_tier_3[1] = @black_tier_3[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 35 
     | 
    
         
            +
                @black_tier_4[1] = @black_tier_4[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 36 
     | 
    
         
            +
                @white_tier_1[1] = @white_tier_1[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 37 
     | 
    
         
            +
                @white_tier_2[1] = @white_tier_2[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 38 
     | 
    
         
            +
                @white_tier_3[1] = @white_tier_3[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 39 
     | 
    
         
            +
                @white_tier_4[1] = @white_tier_4[0].to_f / @total_moves / 2 * 100
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                @black_total[0] = @black_tier_1[0] + @black_tier_2[0] + @black_tier_3[0] + @black_tier_4[0]
         
     | 
| 
      
 42 
     | 
    
         
            +
                @white_total[0] = @white_tier_1[0] + @white_tier_2[0] + @white_tier_3[0] + @white_tier_4[0]
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                @white_total[1] = @white_tier_1[1] + @white_tier_2[1] + @white_tier_3[1] + @white_tier_4[1]
         
     | 
| 
      
 45 
     | 
    
         
            +
                @black_total[1] = @black_tier_1[1] + @black_tier_2[1] + @black_tier_3[1] + @black_tier_4[1]
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              def process
         
     | 
| 
      
 50 
     | 
    
         
            +
                @total_moves = @moves.count;
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                @moves.each do |move|
         
     | 
| 
      
 53 
     | 
    
         
            +
                  current_move = move[1]["move_number"]
         
     | 
| 
      
 54 
     | 
    
         
            +
                  previous_move = @moves[(current_move.to_i - 1).to_s]
         
     | 
| 
      
 55 
     | 
    
         
            +
                  move_made = move[1]["move"]
         
     | 
| 
      
 56 
     | 
    
         
            +
                  if current_move.to_i >= 2
         
     | 
| 
      
 57 
     | 
    
         
            +
                    if previous_move["branches"][0]["moves"][0] == move_made
         
     | 
| 
      
 58 
     | 
    
         
            +
                      current_move % 2 == 0 ? @white_tier_1[0] += 1 : @black_tier_1[0] += 1
         
     | 
| 
      
 59 
     | 
    
         
            +
                    elsif previous_move["branches"].count >= 2 && previous_move["branches"][1]["moves"][0] == move_made
         
     | 
| 
      
 60 
     | 
    
         
            +
                      current_move % 2 == 0 ? @white_tier_2[0] += 1 : @black_tier_2[0] += 1
         
     | 
| 
      
 61 
     | 
    
         
            +
                    elsif previous_move["branches"].count >= 3 && previous_move["branches"][2]["moves"][0] == move_made
         
     | 
| 
      
 62 
     | 
    
         
            +
                      current_move % 2 == 0 ? @white_tier_3[0] += 1 : @black_tier_3[0] += 1
         
     | 
| 
      
 63 
     | 
    
         
            +
                    elsif previous_move["branches"].count >= 4 && previous_move["branches"][3]["moves"][0] == move_made
         
     | 
| 
      
 64 
     | 
    
         
            +
                      current_move % 2 == 0 ? @white_tier_4[0] += 1 : @black_tier_4[0] += 1
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
                calculate_percentages
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Review
         
     | 
| 
      
 2 
     | 
    
         
            +
              attr_accessor :full_review, :number, :id, :type, :game_id, :engine, :engine_version, :network, :network_size, :date, :strength, :win_rate, :moves
         
     | 
| 
      
 3 
     | 
    
         
            +
              @@all = []
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              def initialize(attributes, number:)
         
     | 
| 
      
 6 
     | 
    
         
            +
                attributes.each {|key, value| self.send(("#{key}="), value)}
         
     | 
| 
      
 7 
     | 
    
         
            +
                @number = number
         
     | 
| 
      
 8 
     | 
    
         
            +
                @@all << self
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              def self.all
         
     | 
| 
      
 12 
     | 
    
         
            +
                @@all
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              def self.destroy_all
         
     | 
| 
      
 16 
     | 
    
         
            +
                self.all.clear
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              def self.find_by_number(number)
         
     | 
| 
      
 20 
     | 
    
         
            +
                @@all.find{|review| review.number == number}
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def check
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                puts "Checking player submitted moves against #{@engine} #{@type} review ##{@id}..."
         
     | 
| 
      
 26 
     | 
    
         
            +
                review = load_review
         
     | 
| 
      
 27 
     | 
    
         
            +
                review.process
         
     | 
| 
      
 28 
     | 
    
         
            +
                puts ""
         
     | 
| 
      
 29 
     | 
    
         
            +
                puts "-----------------------------------------------------"
         
     | 
| 
      
 30 
     | 
    
         
            +
                puts "Black Tier 1 Moves: #{review.black_tier_1[0]} --- #{review.black_tier_1[1].round(2)}%"
         
     | 
| 
      
 31 
     | 
    
         
            +
                puts "Black Tier 2 Moves: #{review.black_tier_2[0]} --- #{review.black_tier_2[1].round(2)}%"
         
     | 
| 
      
 32 
     | 
    
         
            +
                puts "Black Tier 3 Moves: #{review.black_tier_3[0]} --- #{review.black_tier_3[1].round(2)}%"
         
     | 
| 
      
 33 
     | 
    
         
            +
                puts "Black Tier 4 Moves: #{review.black_tier_4[0]} --- #{review.black_tier_4[1].round(2)}%"
         
     | 
| 
      
 34 
     | 
    
         
            +
                puts "-----------------------------------------------------"
         
     | 
| 
      
 35 
     | 
    
         
            +
                puts "White Tier 1 Moves: #{review.white_tier_1[0]} --- #{review.white_tier_1[1].round(2)}%"
         
     | 
| 
      
 36 
     | 
    
         
            +
                puts "White Tier 2 Moves: #{review.white_tier_2[0]} --- #{review.white_tier_2[1].round(2)}%"
         
     | 
| 
      
 37 
     | 
    
         
            +
                puts "White Tier 3 Moves: #{review.white_tier_3[0]} --- #{review.white_tier_3[1].round(2)}%"
         
     | 
| 
      
 38 
     | 
    
         
            +
                puts "White Tier 4 Moves: #{review.white_tier_4[0]} --- #{review.white_tier_4[1].round(2)}%"
         
     | 
| 
      
 39 
     | 
    
         
            +
                puts "-----------------------------------------------------"
         
     | 
| 
      
 40 
     | 
    
         
            +
                puts "Black Total Top Moves: #{review.black_total[0]} --- #{review.black_total[1].round(2)}%"
         
     | 
| 
      
 41 
     | 
    
         
            +
                puts "White Total Top Moves: #{review.white_total[0]} --- #{review.white_total[1].round(2)}%"
         
     | 
| 
      
 42 
     | 
    
         
            +
                puts "-----------------------------------------------------"
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              def load_review
         
     | 
| 
      
 47 
     | 
    
         
            +
                FullReview.new(JSON.parse(Faraday.get("https://online-go.com/termination-api/game/#{@game_id}/ai_review/#{@id}").body))
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative 'lib/ogs_katacheck/version'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Gem::Specification.new do |spec|
         
     | 
| 
      
 4 
     | 
    
         
            +
              spec.name          = "ogs_katacheck"
         
     | 
| 
      
 5 
     | 
    
         
            +
              spec.version       = OGSKataCheck::VERSION
         
     | 
| 
      
 6 
     | 
    
         
            +
              spec.authors       = ["RubyMineshaft"]
         
     | 
| 
      
 7 
     | 
    
         
            +
              spec.email         = ["rubymineshaft@online-go.com"]
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              spec.summary       = %q{CLI that checks user submitted moves against AI game reviews.}
         
     | 
| 
      
 10 
     | 
    
         
            +
              spec.description   = %q{This CLI gem is written for OGS team members in order to aid in investigating suspicions of botting.}
         
     | 
| 
      
 11 
     | 
    
         
            +
              spec.homepage      = "https://github.com/RubyMineshaft/ogs_katacheck"
         
     | 
| 
      
 12 
     | 
    
         
            +
              spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              spec.metadata["homepage_uri"] = spec.homepage
         
     | 
| 
      
 17 
     | 
    
         
            +
              spec.metadata["source_code_uri"] = spec.homepage
         
     | 
| 
      
 18 
     | 
    
         
            +
              spec.metadata["changelog_uri"] = "https://github.com/RubyMineshaft/ogs_katacheck/blob/main/CHANGELOG.md"
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              # Specify which files should be added to the gem when it is released.
         
     | 
| 
      
 21 
     | 
    
         
            +
              # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
         
     | 
| 
      
 22 
     | 
    
         
            +
              spec.files         = Dir.chdir(File.expand_path('..', __FILE__)) do
         
     | 
| 
      
 23 
     | 
    
         
            +
                `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
              spec.bindir        = "exe"
         
     | 
| 
      
 26 
     | 
    
         
            +
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         
     | 
| 
      
 27 
     | 
    
         
            +
              spec.require_paths = ["lib"]
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: ogs_katacheck
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.0
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - RubyMineshaft
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: exe
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-10-22 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies: []
         
     | 
| 
      
 13 
     | 
    
         
            +
            description: This CLI gem is written for OGS team members in order to aid in investigating
         
     | 
| 
      
 14 
     | 
    
         
            +
              suspicions of botting.
         
     | 
| 
      
 15 
     | 
    
         
            +
            email:
         
     | 
| 
      
 16 
     | 
    
         
            +
            - rubymineshaft@online-go.com
         
     | 
| 
      
 17 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 18 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 19 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 20 
     | 
    
         
            +
            files:
         
     | 
| 
      
 21 
     | 
    
         
            +
            - ".gitignore"
         
     | 
| 
      
 22 
     | 
    
         
            +
            - CHANGELOG.md
         
     | 
| 
      
 23 
     | 
    
         
            +
            - Gemfile
         
     | 
| 
      
 24 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 25 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 26 
     | 
    
         
            +
            - bin/console
         
     | 
| 
      
 27 
     | 
    
         
            +
            - bin/ogs-katacheck
         
     | 
| 
      
 28 
     | 
    
         
            +
            - bin/setup
         
     | 
| 
      
 29 
     | 
    
         
            +
            - lib/ogs_katacheck.rb
         
     | 
| 
      
 30 
     | 
    
         
            +
            - lib/ogs_katacheck/cli.rb
         
     | 
| 
      
 31 
     | 
    
         
            +
            - lib/ogs_katacheck/full_review.rb
         
     | 
| 
      
 32 
     | 
    
         
            +
            - lib/ogs_katacheck/review.rb
         
     | 
| 
      
 33 
     | 
    
         
            +
            - lib/ogs_katacheck/version.rb
         
     | 
| 
      
 34 
     | 
    
         
            +
            - ogs_katacheck.gemspec
         
     | 
| 
      
 35 
     | 
    
         
            +
            homepage: https://github.com/RubyMineshaft/ogs_katacheck
         
     | 
| 
      
 36 
     | 
    
         
            +
            licenses: []
         
     | 
| 
      
 37 
     | 
    
         
            +
            metadata:
         
     | 
| 
      
 38 
     | 
    
         
            +
              homepage_uri: https://github.com/RubyMineshaft/ogs_katacheck
         
     | 
| 
      
 39 
     | 
    
         
            +
              source_code_uri: https://github.com/RubyMineshaft/ogs_katacheck
         
     | 
| 
      
 40 
     | 
    
         
            +
              changelog_uri: https://github.com/RubyMineshaft/ogs_katacheck/blob/main/CHANGELOG.md
         
     | 
| 
      
 41 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
      
 42 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 43 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 44 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 45 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 46 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 47 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 48 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 49 
     | 
    
         
            +
                  version: 2.3.0
         
     | 
| 
      
 50 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 53 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 55 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 56 
     | 
    
         
            +
            rubyforge_project:
         
     | 
| 
      
 57 
     | 
    
         
            +
            rubygems_version: 2.7.10
         
     | 
| 
      
 58 
     | 
    
         
            +
            signing_key:
         
     | 
| 
      
 59 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 60 
     | 
    
         
            +
            summary: CLI that checks user submitted moves against AI game reviews.
         
     | 
| 
      
 61 
     | 
    
         
            +
            test_files: []
         
     |