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