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