class Ruboty::Handlers::Wandbox

Public Class Methods

new(*__reserved__) click to toggle source
Calls superclass method
# File lib/ruboty/handlers/wandbox.rb, line 11
def initialize(*__reserved__)
        super
        @base_uri=ENV['WANDBOX_BASE']&&!ENV['WANDBOX_BASE'].empty? ? ENV['WANDBOX_BASE'] : 'http://melpon.org/wandbox/'
        @base_uri+='/' if !@base_uri.end_with?('/')
        @input=nil
        @current_submission=nil

        @compiler_list=nil
end

Public Instance Methods

get_compiler_list() click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 20
def get_compiler_list
        @compiler_list ||= lambda{
                lst=JSON.parse Net::HTTP.get URI.parse @base_uri+'api/list.json'
                Hash[*lst.flat_map{|e|
                        [e['name'],e['switches'].flat_map{|f|
                                f['options'] ? f['options'].map{|g|g['name']} : [f['name']]
                        }]
                }]
        }.call
end
languages(message) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 45
def languages(message)
        message.reply get_compiler_list.map{|k,v|k+': '+v*','+"\n"}.join
end
process(result) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 36
def process(result)
        #fixme: status!=0を許容するなら、compile errorをどうやって捕捉するか?
        result['program_output']
end
read_uri(uri) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 30
def read_uri(uri)
        return nil if !uri||uri.empty?
        Kernel.open(uri){|f|
                return f.read
        }
end
setinput(message) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 48
def setinput(message)
        #input_uri: 入力ファイル(空文字列ならクリア)
        if !message[:input_uri]||message[:input_uri].empty?
                @input=nil
                message.reply 'Input cleared.'
        else
                @input=read_uri(message[:input_uri])
                message.reply 'Input set.'
        end
end
submit(message) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 58
def submit(message)
        #language: コンパイラID,オプションID(カンマ区切り)。それぞれ完全一致でなければならない。
        #source_uri: ソースファイル
        #input_uri: 入力ファイル(空文字列ならsetinputの内容を使用)
        input=message[:input_uri]&&!message[:input_uri].empty? ? read_uri(message[:input_uri]) : @input

        lang_options=message[:language].split(',')
        lang=lang_options.shift
        begin
                options=get_compiler_list[lang]
                if !options || !(lang_options-options).empty?
                        message.reply '[Ruboty::Wandbox] invalid compiler name'
                        return
                end
        end
        json={
                compiler: lang,
                code: read_uri(message[:source_uri]),
                options: lang_options*',',
                stdin: input,
                save: false, #fixme
        }
        uri=URI.parse(@base_uri+'api/compile.json')
        Net::HTTP.start(uri.host,uri.port){|http|
                resp=http.post(uri.path,JSON.generate(json),{
                        'Content-Type'=>'application/json',
                })
                json=JSON.parse(resp.body)
                #p json
                #@current_submission=json['permlink']
                message.reply process(json)
        }
end
view(message) click to toggle source
# File lib/ruboty/handlers/wandbox.rb, line 91
def view(message)
        #id: wandbox ID(空文字列なら直前のsubmitで返されたIDを使用 ※現在permlinkを保存しない設定なので特に意味は無い)
        submission=message[:id]&&!message[:id].empty? ? message[:id] : @current_submission
        resp=JSON.parse Net::HTTP.get URI.parse @base_uri+'api/permlink/'+submission
        message.reply process(resp['result'])
end