ledmon 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b685e0b686ceab74164d7d205d3a218a41a3cf6f867b0e450f50ae3f54bf93e
4
- data.tar.gz: 0f1ae8a1ddeb41887039dc5e03df55adbd7033f3dce6252d87f1fdecb310c47e
3
+ metadata.gz: f486209c9291a52c22d5ac6259658baf6f8f2b77e7609e7099580e8eb0004e80
4
+ data.tar.gz: dad85796e2f2cad916be6aee797ec476f511fdb903e6e5900261ef0a32af8692
5
5
  SHA512:
6
- metadata.gz: dc4a2032dc399eb63c5981341b88a25eb99be94004e8ea3d053f61871153e008e73e033b2c6c435343b41ec32edf65525495fec55538d251e66c34b4ddb39717
7
- data.tar.gz: 538efdd0588c7fd89a1cf4f9878ae55cf96cf69f6c6279b72e99e6528157be3f763cb8ee1984248dfdc4a374eb575c274dd7818284135d89c479f7606795c92f
6
+ metadata.gz: 5023ce4213973a097829916d135a60d12f6f961eb21b350f8b4599c903b7713045d6c64225f84bf464a40091ac30b77af7ae931985bc6ead6790fb726a512d87
7
+ data.tar.gz: 3c9b8c78c402634ff1c6d7e5349317bef2d9a8210d4255906f0dd44810ff0ef1b2f47df96e0c847981c8a55f7028aeb0fe6cca388df3535c2c1179b0aa5a2334
data/Rakefile CHANGED
@@ -5,8 +5,4 @@ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
- require "rubocop/rake_task"
9
-
10
- RuboCop::RakeTask.new
11
-
12
- task default: %i[spec rubocop]
8
+ task default: %i[spec]
@@ -25,5 +25,14 @@ module Ledmon::CLI
25
25
  config_value :auth
26
26
  config_value :mode
27
27
  config_value :log_level
28
+
29
+ desc "show", "Show current configuration"
30
+
31
+ def show
32
+ %i[host grpc_port http_port http_proto auth mode log_level].each do |name|
33
+ value = Ledmon::Config.public_send(name)
34
+ puts "#{name}: #{value}"
35
+ end
36
+ end
28
37
  end
29
38
  end
@@ -19,10 +19,10 @@ module Ledmon::CLI
19
19
  def deploy
20
20
  packer = Ledmon::Monster::Packer.new(path: Dir.pwd)
21
21
  packer.pack! do |bundle_path|
22
- deployer = Ledmon::Monster::Deployer.new(bundle_path:)
22
+ deployer = Ledmon::Monster::Deployer.new
23
23
  say "Uploading packed file ...", :yellow
24
24
 
25
- deployer.deploy! do |json_data|
25
+ deployer.deploy!(bundle_path:) do |json_data|
26
26
  if json_data['message']
27
27
  say json_data['message'], :cyan
28
28
  elsif json_data['error']
@@ -38,5 +38,27 @@ module Ledmon::CLI
38
38
  say_error e.message, :red
39
39
  exit 1
40
40
  end
41
+
42
+ desc 'logs', 'Fetch logs from the deployed monster'
43
+
44
+ def logs
45
+ say "Fetching logs from the deployed monster ...", :yellow
46
+
47
+ deployer = Ledmon::Monster::Deployer.new
48
+ deployer.logs do |json_data|
49
+ case json_data['stream']
50
+ when 'stdout'
51
+ say json_data['chunk'], :white
52
+ when 'stderr'
53
+ say_error json_data['chunk'], :red
54
+ else
55
+ if json_data.has_key?('chunk')
56
+ say json_data['chunk'], :white
57
+ else
58
+ say_error "Unknown log format: #{json_data.inspect}", :red
59
+ end
60
+ end
61
+ end
62
+ end
41
63
  end
42
64
  end
@@ -2,22 +2,11 @@
2
2
 
3
3
  module Ledmon::Monster
4
4
  class Deployer
5
- attr_reader :bundle_path
6
-
7
- def initialize(bundle_path:)
8
- @bundle_path = bundle_path
9
- end
10
-
11
- def deploy!(&block)
5
+ def deploy!(bundle_path:, &block)
12
6
  require 'http'
13
7
  require 'json'
14
8
 
15
- url = build_upload_url
16
- headers = {
17
- 'Authorization' => "Bearer #{Ledmon::Config.auth}",
18
- }
19
-
20
- response = HTTP.headers(headers).post(url, form: { file: HTTP::FormData::File.new(bundle_path) })
9
+ response = HTTP.headers(build_headers).post(build_upload_url, form: { file: HTTP::FormData::File.new(bundle_path) })
21
10
 
22
11
  unless response.status.success?
23
12
  raise Ledmon::Error, "Deploy failed with status: #{response.status}"
@@ -29,17 +18,56 @@ module Ledmon::Monster
29
18
 
30
19
  while buffer.include?("\n")
31
20
  line, buffer = buffer.split("\n", 2)
32
- process_json_line(line, &block)
21
+ process_deploy_line(line, &block)
33
22
  end
34
23
  end
35
24
 
36
25
  # Process any remaining data in buffer
37
- process_json_line(buffer, &block) unless buffer.strip.empty?
26
+ process_deploy_line(buffer, &block) unless buffer.strip.empty?
27
+ end
28
+
29
+ def logs(&block)
30
+ response = HTTP.headers(build_headers).get(build_logs_url)
31
+
32
+ unless response.status.success?
33
+ raise Ledmon::Error, "Logs failed with status: #{response.status}"
34
+ end
35
+
36
+ buffer = ""
37
+ response.body.each do |chunk|
38
+ buffer += chunk
39
+
40
+ while buffer.include?("\n")
41
+ line, buffer = buffer.split("\n", 2)
42
+ process_log_line(line, &block)
43
+ end
44
+ end
45
+
46
+ # Process any remaining data in buffer
47
+ process_log_line(buffer, &block) unless buffer.strip.empty?
38
48
  end
39
49
 
40
50
  private
41
51
 
42
- def process_json_line(line, &block)
52
+ def build_headers
53
+ {
54
+ 'Authorization' => "Bearer #{Ledmon::Config.auth}",
55
+ }
56
+ end
57
+
58
+ def process_log_line(line, &block)
59
+ line = line.strip
60
+ return if line.empty?
61
+
62
+ begin
63
+ json_data = JSON.parse(line)
64
+ block&.call(json_data)
65
+ rescue JSON::ParserError
66
+ # Skip invalid JSON lines
67
+ end
68
+ end
69
+
70
+ def process_deploy_line(line, &block)
43
71
  line = line.strip
44
72
  return if line.empty?
45
73
 
@@ -54,5 +82,9 @@ module Ledmon::Monster
54
82
  def build_upload_url
55
83
  "#{Ledmon::Config.http_base_url}/deploys"
56
84
  end
85
+
86
+ def build_logs_url
87
+ "#{Ledmon::Config.http_base_url}/deploys/logs"
88
+ end
57
89
  end
58
90
  end
@@ -40,7 +40,7 @@ module Ledmon::Monster
40
40
  return true, last_challenge_response.challenge_id, last_challenge_response.challenge_input, last_challenge_algo_output
41
41
  elsif response.action == :FAILURE
42
42
  logger.debug("Challenge failed!")
43
- return false, last_challenge_response.challenge_id, last_challenge_response.challenge_input, last_challenge_algo_output
43
+ return false, last_challenge_response&.challenge_id, last_challenge_response&.challenge_input, last_challenge_algo_output
44
44
  end
45
45
  end
46
46
  end
@@ -53,6 +53,10 @@ module Ledmon::Monster
53
53
  client.research(Ledmon::ItemInfo.new(item:))
54
54
  end
55
55
 
56
+ def scrap(item)
57
+ client.scrap(Ledmon::ItemInfo.new(item:))
58
+ end
59
+
56
60
  def equip_item(item, slot)
57
61
  client.equip_item(Ledmon::EquipInfo.new(item:, slot:))
58
62
  end
@@ -74,7 +78,17 @@ module Ledmon::Monster
74
78
  end
75
79
 
76
80
  def look
77
- client.look(Ledmon::Empty.new).entities
81
+ look_data = client.look(Ledmon::Empty.new)
82
+ tiles = []
83
+ for y in -look_data.distance..look_data.distance
84
+ tile_col = []
85
+ for x in -look_data.distance..look_data.distance
86
+ tile_col << look_data.tiles[(x+look_data.distance)+(y+look_data.distance)*(look_data.distance*2+1)]
87
+ end
88
+ tiles << tile_col
89
+ end
90
+
91
+ tiles
78
92
  end
79
93
  end
80
94
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ledmon
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.5"
5
5
  end
@@ -5,13 +5,14 @@
5
5
  require 'google/protobuf'
6
6
 
7
7
 
8
- descriptor_data = "\n\x0bworld.proto\x12\x06ledmon\"\x07\n\x05\x45mpty\"\'\n\tEquipInfo\x12\x0c\n\x04item\x18\x01 \x01(\t\x12\x0c\n\x04slot\x18\x02 \x01(\t\"\x1b\n\x0bUnequipInfo\x12\x0c\n\x04slot\x18\x01 \x01(\t\"\x1c\n\tPingReply\x12\x0f\n\x07message\x18\x01 \x01(\t\"/\n\x0eSessionRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x0e\n\x06\x61vatar\x18\x02 \x01(\t\"C\n\x0cSessionReply\x12%\n\x06status\x18\x01 \x01(\x0e\x32\x15.ledmon.SessionStatus\x12\x0c\n\x04name\x18\x02 \x01(\t\"F\n\nStateReply\x12\x12\n\x05state\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04\x64iff\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_stateB\x07\n\x05_diff\" \n\x08Position\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"\x84\x01\n\x10MovementResponse\x12&\n\x06result\x18\x01 \x01(\x0e\x32\x16.ledmon.MovementResult\x12\'\n\x08position\x18\x02 \x01(\x0b\x32\x10.ledmon.PositionH\x00\x88\x01\x01\x12\x12\n\nsleep_time\x18\x03 \x01(\x02\x42\x0b\n\t_position\"~\n\x12InteractionRequest\x12\x30\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32 .ledmon.InteractionRequestAction\x12\x1f\n\x12\x63hallenge_response\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_challenge_response\"\xa6\x01\n\x13InteractionResponse\x12\x31\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32!.ledmon.InteractionResponseAction\x12\x19\n\x0c\x63hallenge_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0f\x63hallenge_input\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x0f\n\r_challenge_idB\x12\n\x10_challenge_input\"\x89\x01\n\rInventoryData\x12\r\n\x05items\x18\x01 \x03(\t\x12\x37\n\tequipment\x18\x02 \x03(\x0b\x32$.ledmon.InventoryData.EquipmentEntry\x1a\x30\n\x0e\x45quipmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x1b\n\tCraftData\x12\x0e\n\x06recipe\x18\x01 \x01(\t\"\x18\n\x08ItemInfo\x12\x0c\n\x04item\x18\x01 \x01(\t\"\x1d\n\x0bHealthCount\x12\x0e\n\x06health\x18\x01 \x01(\x02\"J\n\x0e\x41\x63tionResponse\x12$\n\x06result\x18\x01 \x01(\x0e\x32\x14.ledmon.ActionResult\x12\x12\n\nsleep_time\x18\x02 \x01(\x02\"H\n\x0cLookResponse\x12$\n\x08\x65ntities\x18\x01 \x03(\x0b\x32\x12.ledmon.LookEntity\x12\x12\n\nsleep_time\x18\x02 \x01(\x02\"O\n\nLookEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\"\n\x08position\x18\x02 \x01(\x0b\x32\x10.ledmon.Position\x12\x11\n\tequipment\x18\x03 \x03(\t\"G\n\x13StorageTransferData\x12\x0c\n\x04item\x18\x01 \x01(\t\x12\"\n\x04mode\x18\x02 \x01(\x0e\x32\x14.ledmon.TransferMode\"\x1c\n\x0bStorageData\x12\r\n\x05items\x18\x01 \x03(\t\"}\n\x10ResearchProgress\x12\x38\n\x08progress\x18\x01 \x03(\x0b\x32&.ledmon.ResearchProgress.ProgressEntry\x1a/\n\rProgressEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\x94\x01\n\x0eTradeOfferList\x12\x32\n\x06offers\x18\x01 \x03(\x0b\x32\".ledmon.TradeOfferList.OffersEntry\x12\x0b\n\x03own\x18\x02 \x03(\t\x1a\x41\n\x0bOffersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.ledmon.TradeOffer:\x02\x38\x01\"@\n\nTradeOffer\x12\x0e\n\x06inputs\x18\x01 \x03(\t\x12\x0f\n\x07outputs\x18\x02 \x03(\t\x12\x11\n\tremaining\x18\x03 \x01(\x05\"\x1a\n\x0cTradeOfferId\x12\n\n\x02id\x18\x01 \x01(\t\"\"\n\x12\x43onsumableDuration\x12\x0c\n\x04time\x18\x01 \x01(\x02*=\n\rSessionStatus\x12\x0b\n\x07STARTED\x10\x00\x12\x0c\n\x08\x46INISHED\x10\x01\x12\x11\n\rINVALID_TOKEN\x10\x02*%\n\x0eMovementResult\x12\x06\n\x02OK\x10\x00\x12\x0b\n\x07\x42LOCKED\x10\x01*;\n\x18InteractionRequestAction\x12\t\n\x05START\x10\x00\x12\x14\n\x10SUBMIT_CHALLENGE\x10\x01*D\n\x19InteractionResponseAction\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x12\r\n\tCHALLENGE\x10\x02**\n\x0c\x41\x63tionResult\x12\x0e\n\nSUCCESSFUL\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01*%\n\x0cTransferMode\x12\x08\n\x04TAKE\x10\x00\x12\x0b\n\x07\x44\x45POSIT\x10\x01\x32\xd9\r\n\x05World\x12*\n\x04Ping\x12\r.ledmon.Empty\x1a\x11.ledmon.PingReply\"\x00\x12\x32\n\nPingStream\x12\r.ledmon.Empty\x1a\x11.ledmon.PingReply\"\x00\x30\x01\x12;\n\x07Session\x12\x16.ledmon.SessionRequest\x1a\x14.ledmon.SessionReply\"\x00\x30\x01\x12+\n\tKeepAlive\x12\r.ledmon.Empty\x1a\r.ledmon.Empty\"\x00\x12/\n\x08GetState\x12\r.ledmon.Empty\x1a\x12.ledmon.StateReply\"\x00\x12\x37\n\x0eGetStateStream\x12\r.ledmon.Empty\x1a\x12.ledmon.StateReply\"\x00\x30\x01\x12\x38\n\x0bMoveForward\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x39\n\x0cMoveBackward\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x35\n\x08TurnLeft\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x36\n\tTurnRight\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x37\n\nTurnAround\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12I\n\x08Interact\x12\x1a.ledmon.InteractionRequest\x1a\x1b.ledmon.InteractionResponse\"\x00(\x01\x30\x01\x12\x34\n\x05\x43raft\x12\x11.ledmon.CraftData\x1a\x16.ledmon.ActionResponse\"\x00\x12H\n\x0fStorageTransfer\x12\x1b.ledmon.StorageTransferData\x1a\x16.ledmon.ActionResponse\"\x00\x12\x33\n\x0bStorageList\x12\r.ledmon.Empty\x1a\x13.ledmon.StorageData\"\x00\x12\x36\n\x08Research\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12;\n\rScrapResearch\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12@\n\x13GetResearchProgress\x12\r.ledmon.Empty\x1a\x18.ledmon.ResearchProgress\"\x00\x12:\n\x0fListTradeOffers\x12\r.ledmon.Empty\x1a\x16.ledmon.TradeOfferList\"\x00\x12>\n\x10\x43reateTradeOffer\x12\x12.ledmon.TradeOffer\x1a\x14.ledmon.TradeOfferId\"\x00\x12\x42\n\x10\x41\x63\x63\x65ptTradeOffer\x12\x14.ledmon.TradeOfferId\x1a\x16.ledmon.ActionResponse\"\x00\x12\x39\n\x10\x43\x61ncelTradeOffer\x12\x14.ledmon.TradeOfferId\x1a\r.ledmon.Empty\"\x00\x12\x36\n\x0cGetInventory\x12\r.ledmon.Empty\x1a\x15.ledmon.InventoryData\"\x00\x12\x38\n\tEquipItem\x12\x11.ledmon.EquipInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12<\n\x0bUnequipItem\x12\x13.ledmon.UnequipInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12\x31\n\tGetHealth\x12\r.ledmon.Empty\x1a\x13.ledmon.HealthCount\"\x00\x12\x31\n\x06\x41ttack\x12\r.ledmon.Empty\x1a\x16.ledmon.ActionResponse\"\x00\x12\x39\n\x0b\x43onsumeItem\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12M\n\x1eGetRemainingConsumableDuration\x12\r.ledmon.Empty\x1a\x1a.ledmon.ConsumableDuration\"\x00\x12-\n\x04Look\x12\r.ledmon.Empty\x1a\x14.ledmon.LookResponse\"\x00\x62\x06proto3"
8
+ descriptor_data = "\n\x0bworld.proto\x12\x06ledmon\"\x07\n\x05\x45mpty\"\x84\x01\n\x07MapInfo\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x10\n\x08tilesize\x18\x03 \x01(\x05\x12\x0f\n\x07spawn_x\x18\x04 \x01(\x05\x12\x0f\n\x07spawn_y\x18\x05 \x01(\x05\x12\x13\n\x0b\x66og_enabled\x18\x06 \x01(\x08\x12\x11\n\tmap_image\x18\x07 \x01(\t\"\'\n\tEquipInfo\x12\x0c\n\x04item\x18\x01 \x01(\t\x12\x0c\n\x04slot\x18\x02 \x01(\t\"\x1b\n\x0bUnequipInfo\x12\x0c\n\x04slot\x18\x01 \x01(\t\"\x1c\n\tPingReply\x12\x0f\n\x07message\x18\x01 \x01(\t\"/\n\x0eSessionRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x0e\n\x06\x61vatar\x18\x02 \x01(\t\"C\n\x0cSessionReply\x12%\n\x06status\x18\x01 \x01(\x0e\x32\x15.ledmon.SessionStatus\x12\x0c\n\x04name\x18\x02 \x01(\t\"F\n\nStateReply\x12\x12\n\x05state\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04\x64iff\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_stateB\x07\n\x05_diff\" \n\x08Position\x12\t\n\x01x\x18\x01 \x01(\x05\x12\t\n\x01y\x18\x02 \x01(\x05\"\x84\x01\n\x10MovementResponse\x12&\n\x06result\x18\x01 \x01(\x0e\x32\x16.ledmon.MovementResult\x12\'\n\x08position\x18\x02 \x01(\x0b\x32\x10.ledmon.PositionH\x00\x88\x01\x01\x12\x12\n\nsleep_time\x18\x03 \x01(\x02\x42\x0b\n\t_position\"~\n\x12InteractionRequest\x12\x30\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32 .ledmon.InteractionRequestAction\x12\x1f\n\x12\x63hallenge_response\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_challenge_response\"\xa6\x01\n\x13InteractionResponse\x12\x31\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32!.ledmon.InteractionResponseAction\x12\x19\n\x0c\x63hallenge_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0f\x63hallenge_input\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x0f\n\r_challenge_idB\x12\n\x10_challenge_input\"\x89\x01\n\rInventoryData\x12\r\n\x05items\x18\x01 \x03(\t\x12\x37\n\tequipment\x18\x02 \x03(\x0b\x32$.ledmon.InventoryData.EquipmentEntry\x1a\x30\n\x0e\x45quipmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x1b\n\tCraftData\x12\x0e\n\x06recipe\x18\x01 \x01(\t\"\x18\n\x08ItemInfo\x12\x0c\n\x04item\x18\x01 \x01(\t\"\x1d\n\x0bHealthCount\x12\x0e\n\x06health\x18\x01 \x01(\x02\"J\n\x0e\x41\x63tionResponse\x12$\n\x06result\x18\x01 \x01(\x0e\x32\x14.ledmon.ActionResult\x12\x12\n\nsleep_time\x18\x02 \x01(\x02\"U\n\x0cLookResponse\x12\x1f\n\x05tiles\x18\x01 \x03(\x0b\x32\x10.ledmon.LookTile\x12\x10\n\x08\x64istance\x18\x02 \x01(\x05\x12\x12\n\nsleep_time\x18\x03 \x01(\x02\"\x80\x01\n\x08LookTile\x12\x10\n\x08walkable\x18\x01 \x01(\x08\x12\x14\n\x07station\x18\x02 \x01(\tH\x00\x88\x01\x01\x12$\n\x08\x65ntities\x18\x03 \x03(\x0b\x32\x12.ledmon.LookEntity\x12\x11\n\x04zone\x18\x04 \x01(\tH\x01\x88\x01\x01\x42\n\n\x08_stationB\x07\n\x05_zone\"O\n\nLookEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\"\n\x08position\x18\x02 \x01(\x0b\x32\x10.ledmon.Position\x12\x11\n\tequipment\x18\x03 \x03(\t\"G\n\x13StorageTransferData\x12\x0c\n\x04item\x18\x01 \x01(\t\x12\"\n\x04mode\x18\x02 \x01(\x0e\x32\x14.ledmon.TransferMode\"\x1c\n\x0bStorageData\x12\r\n\x05items\x18\x01 \x03(\t\"}\n\x10ResearchProgress\x12\x38\n\x08progress\x18\x01 \x03(\x0b\x32&.ledmon.ResearchProgress.ProgressEntry\x1a/\n\rProgressEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"\x94\x01\n\x0eTradeOfferList\x12\x32\n\x06offers\x18\x01 \x03(\x0b\x32\".ledmon.TradeOfferList.OffersEntry\x12\x0b\n\x03own\x18\x02 \x03(\t\x1a\x41\n\x0bOffersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.ledmon.TradeOffer:\x02\x38\x01\"@\n\nTradeOffer\x12\x0e\n\x06inputs\x18\x01 \x03(\t\x12\x0f\n\x07outputs\x18\x02 \x03(\t\x12\x11\n\tremaining\x18\x03 \x01(\x05\"\x1a\n\x0cTradeOfferId\x12\n\n\x02id\x18\x01 \x01(\t\"\"\n\x12\x43onsumableDuration\x12\x0c\n\x04time\x18\x01 \x01(\x02\"\x1e\n\x0eScoreboardData\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\t*=\n\rSessionStatus\x12\x0b\n\x07STARTED\x10\x00\x12\x0c\n\x08\x46INISHED\x10\x01\x12\x11\n\rINVALID_TOKEN\x10\x02*%\n\x0eMovementResult\x12\x06\n\x02OK\x10\x00\x12\x0b\n\x07\x42LOCKED\x10\x01*;\n\x18InteractionRequestAction\x12\t\n\x05START\x10\x00\x12\x14\n\x10SUBMIT_CHALLENGE\x10\x01*D\n\x19InteractionResponseAction\x12\x0b\n\x07SUCCESS\x10\x00\x12\x0b\n\x07\x46\x41ILURE\x10\x01\x12\r\n\tCHALLENGE\x10\x02**\n\x0c\x41\x63tionResult\x12\x0e\n\nSUCCESSFUL\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01*%\n\x0cTransferMode\x12\x08\n\x04TAKE\x10\x00\x12\x0b\n\x07\x44\x45POSIT\x10\x01\x32\xbb\x0e\n\x05World\x12*\n\x04Ping\x12\r.ledmon.Empty\x1a\x11.ledmon.PingReply\"\x00\x12\x32\n\nPingStream\x12\r.ledmon.Empty\x1a\x11.ledmon.PingReply\"\x00\x30\x01\x12.\n\nGetMapInfo\x12\r.ledmon.Empty\x1a\x0f.ledmon.MapInfo\"\x00\x12;\n\x07Session\x12\x16.ledmon.SessionRequest\x1a\x14.ledmon.SessionReply\"\x00\x30\x01\x12+\n\tKeepAlive\x12\r.ledmon.Empty\x1a\r.ledmon.Empty\"\x00\x12/\n\x08GetState\x12\r.ledmon.Empty\x1a\x12.ledmon.StateReply\"\x00\x12\x37\n\x0eGetStateStream\x12\r.ledmon.Empty\x1a\x12.ledmon.StateReply\"\x00\x30\x01\x12\x38\n\rGetScoreboard\x12\r.ledmon.Empty\x1a\x16.ledmon.ScoreboardData\"\x00\x12\x38\n\x0bMoveForward\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x39\n\x0cMoveBackward\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x35\n\x08TurnLeft\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x36\n\tTurnRight\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12\x37\n\nTurnAround\x12\r.ledmon.Empty\x1a\x18.ledmon.MovementResponse\"\x00\x12I\n\x08Interact\x12\x1a.ledmon.InteractionRequest\x1a\x1b.ledmon.InteractionResponse\"\x00(\x01\x30\x01\x12\x34\n\x05\x43raft\x12\x11.ledmon.CraftData\x1a\x16.ledmon.ActionResponse\"\x00\x12H\n\x0fStorageTransfer\x12\x1b.ledmon.StorageTransferData\x1a\x16.ledmon.ActionResponse\"\x00\x12\x33\n\x0bStorageList\x12\r.ledmon.Empty\x1a\x13.ledmon.StorageData\"\x00\x12\x36\n\x08Research\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12\x33\n\x05Scrap\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12@\n\x13GetResearchProgress\x12\r.ledmon.Empty\x1a\x18.ledmon.ResearchProgress\"\x00\x12:\n\x0fListTradeOffers\x12\r.ledmon.Empty\x1a\x16.ledmon.TradeOfferList\"\x00\x12>\n\x10\x43reateTradeOffer\x12\x12.ledmon.TradeOffer\x1a\x14.ledmon.TradeOfferId\"\x00\x12\x42\n\x10\x41\x63\x63\x65ptTradeOffer\x12\x14.ledmon.TradeOfferId\x1a\x16.ledmon.ActionResponse\"\x00\x12\x39\n\x10\x43\x61ncelTradeOffer\x12\x14.ledmon.TradeOfferId\x1a\r.ledmon.Empty\"\x00\x12\x36\n\x0cGetInventory\x12\r.ledmon.Empty\x1a\x15.ledmon.InventoryData\"\x00\x12\x38\n\tEquipItem\x12\x11.ledmon.EquipInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12<\n\x0bUnequipItem\x12\x13.ledmon.UnequipInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12\x31\n\tGetHealth\x12\r.ledmon.Empty\x1a\x13.ledmon.HealthCount\"\x00\x12\x31\n\x06\x41ttack\x12\r.ledmon.Empty\x1a\x16.ledmon.ActionResponse\"\x00\x12\x39\n\x0b\x43onsumeItem\x12\x10.ledmon.ItemInfo\x1a\x16.ledmon.ActionResponse\"\x00\x12M\n\x1eGetRemainingConsumableDuration\x12\r.ledmon.Empty\x1a\x1a.ledmon.ConsumableDuration\"\x00\x12-\n\x04Look\x12\r.ledmon.Empty\x1a\x14.ledmon.LookResponse\"\x00\x62\x06proto3"
9
9
 
10
- pool = Google::Protobuf::DescriptorPool.generated_pool
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
11
  pool.add_serialized_file(descriptor_data)
12
12
 
13
13
  module Ledmon
14
14
  Empty = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.Empty").msgclass
15
+ MapInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.MapInfo").msgclass
15
16
  EquipInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.EquipInfo").msgclass
16
17
  UnequipInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.UnequipInfo").msgclass
17
18
  PingReply = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.PingReply").msgclass
@@ -28,6 +29,7 @@ module Ledmon
28
29
  HealthCount = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.HealthCount").msgclass
29
30
  ActionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.ActionResponse").msgclass
30
31
  LookResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.LookResponse").msgclass
32
+ LookTile = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.LookTile").msgclass
31
33
  LookEntity = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.LookEntity").msgclass
32
34
  StorageTransferData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.StorageTransferData").msgclass
33
35
  StorageData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.StorageData").msgclass
@@ -36,6 +38,7 @@ module Ledmon
36
38
  TradeOffer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.TradeOffer").msgclass
37
39
  TradeOfferId = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.TradeOfferId").msgclass
38
40
  ConsumableDuration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.ConsumableDuration").msgclass
41
+ ScoreboardData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.ScoreboardData").msgclass
39
42
  SessionStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.SessionStatus").enummodule
40
43
  MovementResult = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.MovementResult").enummodule
41
44
  InteractionRequestAction = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("ledmon.InteractionRequestAction").enummodule
@@ -16,10 +16,12 @@ module Ledmon
16
16
 
17
17
  rpc :Ping, ::Ledmon::Empty, ::Ledmon::PingReply
18
18
  rpc :PingStream, ::Ledmon::Empty, stream(::Ledmon::PingReply)
19
+ rpc :GetMapInfo, ::Ledmon::Empty, ::Ledmon::MapInfo
19
20
  rpc :Session, ::Ledmon::SessionRequest, stream(::Ledmon::SessionReply)
20
21
  rpc :KeepAlive, ::Ledmon::Empty, ::Ledmon::Empty
21
22
  rpc :GetState, ::Ledmon::Empty, ::Ledmon::StateReply
22
23
  rpc :GetStateStream, ::Ledmon::Empty, stream(::Ledmon::StateReply)
24
+ rpc :GetScoreboard, ::Ledmon::Empty, ::Ledmon::ScoreboardData
23
25
  rpc :MoveForward, ::Ledmon::Empty, ::Ledmon::MovementResponse
24
26
  rpc :MoveBackward, ::Ledmon::Empty, ::Ledmon::MovementResponse
25
27
  rpc :TurnLeft, ::Ledmon::Empty, ::Ledmon::MovementResponse
@@ -30,7 +32,7 @@ module Ledmon
30
32
  rpc :StorageTransfer, ::Ledmon::StorageTransferData, ::Ledmon::ActionResponse
31
33
  rpc :StorageList, ::Ledmon::Empty, ::Ledmon::StorageData
32
34
  rpc :Research, ::Ledmon::ItemInfo, ::Ledmon::ActionResponse
33
- rpc :ScrapResearch, ::Ledmon::ItemInfo, ::Ledmon::ActionResponse
35
+ rpc :Scrap, ::Ledmon::ItemInfo, ::Ledmon::ActionResponse
34
36
  rpc :GetResearchProgress, ::Ledmon::Empty, ::Ledmon::ResearchProgress
35
37
  rpc :ListTradeOffers, ::Ledmon::Empty, ::Ledmon::TradeOfferList
36
38
  rpc :CreateTradeOffer, ::Ledmon::TradeOffer, ::Ledmon::TradeOfferId
data/monster.rb.sample CHANGED
@@ -1,7 +1,3 @@
1
- def name
2
- 'ahmed'
3
- end
4
-
5
1
  def avatar
6
2
  "@@@@@
7
3
  @)))@
@@ -42,8 +38,20 @@ def brain
42
38
  when 'j' then
43
39
  attack
44
40
  when 'l' then
45
- entities = look
46
- say "look: #{entities.inspect}"
41
+ tiles = look
42
+
43
+ for col in tiles
44
+ for tile in col
45
+ if tile.entities.size > 0 then
46
+ print "E "
47
+ elsif tile.walkable
48
+ print "_ "
49
+ else
50
+ print "O "
51
+ end
52
+ end
53
+ puts ""
54
+ end
47
55
  else
48
56
  nil
49
57
  end
data/protos/world.proto CHANGED
@@ -6,12 +6,16 @@ service World {
6
6
  rpc Ping (Empty) returns (PingReply) {}
7
7
  rpc PingStream (Empty) returns (stream PingReply) {}
8
8
 
9
+ rpc GetMapInfo (Empty) returns (MapInfo) {}
10
+
9
11
  rpc Session (SessionRequest) returns (stream SessionReply) {}
10
12
  rpc KeepAlive (Empty) returns (Empty) {}
11
13
 
12
14
  rpc GetState (Empty) returns (StateReply) {}
13
15
  rpc GetStateStream (Empty) returns (stream StateReply) {}
14
16
 
17
+ rpc GetScoreboard (Empty) returns (ScoreboardData) {}
18
+
15
19
  rpc MoveForward (Empty) returns (MovementResponse) {}
16
20
  rpc MoveBackward (Empty) returns (MovementResponse) {}
17
21
  rpc TurnLeft (Empty) returns (MovementResponse) {}
@@ -23,7 +27,7 @@ service World {
23
27
  rpc StorageTransfer (StorageTransferData) returns (ActionResponse) {}
24
28
  rpc StorageList (Empty) returns (StorageData) {}
25
29
  rpc Research (ItemInfo) returns (ActionResponse) {}
26
- rpc ScrapResearch (ItemInfo) returns (ActionResponse) {}
30
+ rpc Scrap (ItemInfo) returns (ActionResponse) {}
27
31
  rpc GetResearchProgress (Empty) returns (ResearchProgress) {}
28
32
  rpc ListTradeOffers (Empty) returns (TradeOfferList) {}
29
33
  rpc CreateTradeOffer (TradeOffer) returns (TradeOfferId) {}
@@ -46,6 +50,16 @@ message Empty {
46
50
 
47
51
  }
48
52
 
53
+ message MapInfo {
54
+ int32 width = 1;
55
+ int32 height = 2;
56
+ int32 tilesize = 3;
57
+ int32 spawn_x = 4;
58
+ int32 spawn_y = 5;
59
+ bool fog_enabled = 6;
60
+ string map_image = 7;
61
+ }
62
+
49
63
  message EquipInfo{
50
64
  string item = 1;
51
65
  string slot = 2;
@@ -146,8 +160,15 @@ message ActionResponse {
146
160
  }
147
161
 
148
162
  message LookResponse{
149
- repeated LookEntity entities = 1;
150
- float sleep_time = 2;
163
+ repeated LookTile tiles = 1;
164
+ int32 distance = 2;
165
+ float sleep_time = 3;
166
+ }
167
+ message LookTile{
168
+ bool walkable = 1;
169
+ optional string station = 2;
170
+ repeated LookEntity entities = 3;
171
+ optional string zone = 4;
151
172
  }
152
173
  message LookEntity{
153
174
  string id = 1;
@@ -183,3 +204,6 @@ message TradeOfferId{
183
204
  message ConsumableDuration{
184
205
  float time = 1;
185
206
  }
207
+ message ScoreboardData{
208
+ string data = 1;
209
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledmon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ahmed Al Hafoudh