class Ruboty::Handlers::Ideone
Constants
- LANGUAGES
Public Class Methods
new(*__reserved__)
click to toggle source
Calls superclass method
# File lib/ruboty/handlers/ideone.rb, line 90 def initialize(*__reserved__) super @client=Savon.client(log:false,wsdl:'http://ideone.com/api/1/service.wsdl') @user=ENV['IDEONE_USER'] @pass=ENV['IDEONE_PASS'] @input=nil @current_submission=nil @languages=LANGUAGES end
Public Instance Methods
languages(message)
click to toggle source
# File lib/ruboty/handlers/ideone.rb, line 114 def languages(message) resp=@client.call(:get_languages,message:{user:@user,pass:@pass}) item=resp.body[:get_languages_response][:return][:item][1][:value] if item&&item[:item] @languages=item[:item] message.reply item[:item].map{|e|"#{'%4d:'%e[:key]} #{e[:value]}\n"}.join end end
read_uri(uri)
click to toggle source
# File lib/ruboty/handlers/ideone.rb, line 100 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/ideone.rb, line 122 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/ideone.rb, line 132 def submit(message) #language: ID(数値)または言語名(文字列)。言語名の場合、記号類を除いて最大先頭一致のものを使用する。 #source_uri: ソースファイル #input_uri: 入力ファイル(空文字列ならsetinputの内容を使用) input=message[:input_uri]&&!message[:input_uri].empty? ? read_uri(message[:input_uri]) : @input #guess lang lang=message[:language] if lang.to_i>0 lang=lang.to_i else lang=lang.downcase.gsub(/[\s\(\)\.]/,'') lang=@languages.max_by{|e| _e=e[:value].downcase.gsub(/[\s\(\)\.]/,'') lang.size.downto(1).find{|i|_e.start_with?(lang[0,i])}||-1 }[:key].to_i end resp=@client.call(:create_submission,message:{ user:@user,pass:@pass,source_code:read_uri(message[:source_uri]),input:input,run:true,private:true,language:lang }) result=Hash[*resp.body[:create_submission_response][:return][:item].flat_map{|e|[e[:key],e[:value]]}] if result['error']=='AUTH_ERROR' message.reply '[Ruboty::Ideone] wrong authentication' elsif result['error']!='OK' message.reply '[Ruboty::Ideone] something wrong happened in submission' else @current_submission=result['link'] message.reply 'http://ideone.com/'+result['link'] end end
view(message)
click to toggle source
# File lib/ruboty/handlers/ideone.rb, line 161 def view(message) #id: ideone ID(空文字列なら直前のsubmitで返されたIDを使用) submission=message[:id]&&!message[:id].empty? ? message[:id] : @current_submission resp=@client.call(:get_submission_details,message:{ user:@user,pass:@pass,link:submission,with_output:true }) result=Hash[*resp.body[:get_submission_details_response][:return][:item].flat_map{|e|[e[:key],e[:value]]}] if result['status'].to_i<0 message.reply '[Ruboty::Ideone] waiting for compilation' elsif result['status'].to_i==1 message.reply '[Ruboty::Ideone] compiling' elsif result['status'].to_i==3 message.reply '[Ruboty::Ideone] running' elsif result['error']!='OK' message.reply '[Ruboty::Ideone] something wrong happened in execution' elsif result['result'].to_i==15 message.reply result['output'] else message.reply('[Ruboty::Ideone] '+{ 0=>'not running', 11=>'compilation error', 12=>'runtime error', 13=>'time limit exceeded', 17=>'memory limit exceeded', 19=>'illegal system call', 20=>'internal error', }[result['result'].to_i]) end end