Class: Ruboty::Handlers::Wandbox

Inherits:
Base
  • Object
show all
Defined in:
lib/ruboty/handlers/wandbox.rb

Instance Method Summary collapse

Constructor Details

#initialize(*__reserved__) ⇒ Wandbox

Returns a new instance of Wandbox.



11
12
13
14
15
16
17
18
19
# 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

Instance Method Details

#get_compiler_listObject



20
21
22
23
24
25
26
27
28
29
# 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) ⇒ Object



45
46
47
# 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) ⇒ Object



36
37
38
39
# File 'lib/ruboty/handlers/wandbox.rb', line 36

def process(result)
	#fixme: status!=0を許容するなら、compile errorをどうやって捕捉するか?
	result['program_output']
end

#read_uri(uri) ⇒ Object



30
31
32
33
34
35
# 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) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# 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) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 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) ⇒ Object



91
92
93
94
95
96
# 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