tac_scribe 0.6.0 → 0.7.3.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f357b6fb0a4a45accdc07e20ff29fe6a93c66d7b88665ea51a652ca28a2b1d4
4
- data.tar.gz: b01e4759b8e523fee4541b71b43102fcb62d228a15b3c87bb6b969fc33e6e206
3
+ metadata.gz: d9a4c4ff87f88c46b4a02e0cd8a0ac729f9932b5a82db7b8851aa9180183e0f9
4
+ data.tar.gz: 3011df9a3162d4209bd12f5d6a1383de4e4f26f624316112dcf6c973f8bfabbc
5
5
  SHA512:
6
- metadata.gz: fc97730d7e4b521a46987f2ea01d2680715933571ce33218e8ad69033a35df0b9722fcc123af082d71cd70487d7caab60765d171c5b29301445d0ec6c3178ea8
7
- data.tar.gz: 3e27a7a3957fab068f168dad158a6ae555faab3a40fa8535c0ee65629fe8d4915255c41890ff0d0ea79e3a36b24e8642d4df4f3747a891fd90b175e4883a9a59
6
+ metadata.gz: 5434ff0ddcae2e7f9036695851b5a309b5d33a28f2b7be01a3fe61914aedb0f99fe2e5e4b7260c5b0da1f86e780e6761ec80c8de3fbad94ade95c4375b380066
7
+ data.tar.gz: 38b1e100620beed93ce87f813cdcbbe42646cfbc1e3bba8ac59ee564f1b219ca96f7e3959fb171fb2f7e5ce19dd6217c767940f5758bec1954fa43cdf0f28b19
@@ -1 +1 @@
1
- ruby-2.6.3
1
+ ruby-2.7.0
@@ -4,20 +4,48 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [0.6.0]
7
+ ## [Unreleased]
8
+
9
+ ## [0.7.3] - 2020-08-10
10
+ ### Changed
11
+ - Bug fixes after adding CinC support.
12
+
13
+ ## [0.7.2] - 2020-08-10
14
+ ### Added
15
+ - Support for "Commander-In-Chief" to get airbase information
16
+
17
+ ## [0.7.1] - 2020-08-10
18
+ ### Changed
19
+ - Fixed issue where "name" fields were not being populated
20
+ if airfields were not being loaded first
21
+
22
+ ## [0.7.0] - 2020-07-5
23
+ ### Changed
24
+ - Synced Lat/Lon calculations with DCS and fixed issue where
25
+ calculations were incorrect if only one value was updated
26
+
27
+ ## [0.6.2] - 2020-04-19
28
+ ### Changed
29
+ - Fixed typo causing app to fail
30
+
31
+ ## [0.6.1] - 2020-04-19
32
+ ### Changed
33
+ - Test build for gem issue
34
+
35
+ ## [0.6.0] - 2020-04-19
8
36
  ### Added
9
37
  - Calculates and stores speed of units
10
38
 
11
39
  ### Fixed
12
40
  - Made more robust against failures and more logging messages
13
41
 
14
- ## [0.5.0]
42
+ ## [0.5.0] - 2020-03-17
15
43
  ### Changed
16
44
  - Added missing db column to migration file
17
45
  - Clear the cache on server restart
18
46
  - Add more info to logging
19
47
 
20
- ## [0.4.0]
48
+ ## [0.4.0] - 2020-03-13
21
49
  ### Changed
22
50
  - Switch to periodic writing to the database
23
51
 
@@ -10,6 +10,8 @@ options = {
10
10
  tacview_port: 42_674,
11
11
  tacview_password: nil,
12
12
  tacview_client_name: 'TacScribe',
13
+ cinc_enabled: false,
14
+ cinc_port: 9000,
13
15
  db_host: 'localhost',
14
16
  db_port: 5432,
15
17
  db_name: 'tac_scribe',
@@ -43,6 +45,17 @@ OptionParser.new do |opts|
43
45
  options[:tacview_client_name] = v
44
46
  end
45
47
 
48
+ opts.separator "\nCommander-In-Chief Options"
49
+ opts.on('-b', '--enable-cinc',
50
+ 'Is Cinc enabled? (Default: false)') do |_v|
51
+ options[:cinc_enabled] = true
52
+ end
53
+ opts.on('-m', '--cinc-port=port',
54
+ 'Cinc server port (Default: 9001)') do |v|
55
+ options[:cinc_port] = v
56
+ end
57
+
58
+
46
59
  opts.separator "\nDatabase Options"
47
60
  opts.on('-o', '--db-host=host',
48
61
  'Postgresql server hostname / IP (Default: localhost)') do |v|
@@ -52,7 +65,7 @@ OptionParser.new do |opts|
52
65
  'Postgresql server port (Default: 5432)') do |v|
53
66
  options[:db_port] = v
54
67
  end
55
- opts.on('-u', '--db-username=username',
68
+ opts.on('-u', '--db-user=username',
56
69
  'Postgresql username (Required)') do |v|
57
70
  options[:db_user] = v
58
71
  end
@@ -92,6 +105,11 @@ end.parse!
92
105
  exit(1)
93
106
  end
94
107
 
108
+ if(options[:populate_airfields] && options[:cinc_enabled])
109
+ puts "You cannot populate airfields AND enable Cinc at the same time"
110
+ exit(1)
111
+ end
112
+
95
113
  TacScribe::Daemon.new(
96
114
  tacview_host: options[:tacview_host],
97
115
  tacview_port: options[:tacview_port],
@@ -105,5 +123,7 @@ TacScribe::Daemon.new(
105
123
  verbose_logging: options[:verbose],
106
124
  thread_count: options[:threads].to_i,
107
125
  populate_airfields: options[:populate_airfields],
108
- whitelist: options[:whitelist]
126
+ whitelist: options[:whitelist],
127
+ cinc_enabled: options[:cinc_enabled],
128
+ cinc_port: options[:cinc_port]
109
129
  ).start_processing
@@ -23,11 +23,12 @@ module TacScribe
23
23
  end
24
24
 
25
25
  def write_object(object)
26
- if reference_latitude != 0 || reference_longitude != 0
26
+ if (reference_latitude != 0 || reference_longitude != 0) && object[:type] != "Ground+Static+Aerodrome"
27
27
  localize_position(object)
28
28
  end
29
29
 
30
30
  id = object[:object_id]
31
+ id ||= object[:id].to_s
31
32
  object[:id] = id
32
33
 
33
34
  cache_object = @@cache[id]
@@ -38,18 +39,29 @@ module TacScribe
38
39
  object.delete(key)
39
40
  end
40
41
 
41
- if object[:coalition]
42
+ # https://wiki.hoggitworld.com/view/DCS_singleton_coalition
43
+ # Tacview returns a string, CinC returns an integer so we
44
+ # only do the conversion if there is a string.
45
+ if object[:coalition] && object[:coalition].is_a?(String)
42
46
  object[:coalition] = case object[:coalition]
43
- when 'Allies'
44
- 0
45
- when 'Enemies'
46
- 1
47
- else
47
+ when 'Enemies' # Enemies is Bluefor
48
48
  2
49
+ when 'Allies' # Allies is Redfor
50
+ 1
51
+ else # Neutral
52
+ 0
49
53
  end
50
54
  end
51
55
 
52
- if cache_object
56
+ if object[:type] = "Ground+Static+Aerodrome"
57
+ object[:heading] = object[:wind_heading] ? object[:wind_heading] : 0
58
+ object[:speed] = object[:wind_speed] ? object[:wind_speec] : 0
59
+ object.delete(:wind_heading)
60
+ object.delete(:wind_speed)
61
+ object.delete(:category)
62
+ cache_object = object
63
+ # No-op
64
+ elsif cache_object
53
65
  object[:heading] = calculate_heading(cache_object, object)
54
66
  object[:speed] = calculate_speed(cache_object, object)
55
67
  cache_object.merge!(object)
@@ -83,6 +95,8 @@ module TacScribe
83
95
 
84
96
  def clear
85
97
  @@cache.clear
98
+ self.reference_latitude = nil
99
+ self.reference_longitude = nil
86
100
  end
87
101
 
88
102
  private
@@ -100,13 +114,13 @@ module TacScribe
100
114
  longitude = if object.key?(:longitude)
101
115
  object[:longitude]
102
116
  else
103
- cache_object[:position].y
117
+ cache_object[:position].x
104
118
  end
105
119
 
106
120
  latitude = if object.key?(:latitude)
107
121
  object[:latitude]
108
122
  else
109
- cache_object[:position].x
123
+ cache_object[:position].y
110
124
  end
111
125
 
112
126
  # This "Point" class is not lat/long aware which is why we are
@@ -3,6 +3,7 @@
3
3
  require 'json'
4
4
  require 'tacview_client'
5
5
  require 'set'
6
+ require 'cinc'
6
7
  require_relative 'datastore'
7
8
  require_relative 'cache'
8
9
  require_relative 'event_queue'
@@ -15,7 +16,7 @@ module TacScribe
15
16
  def initialize(db_host:, db_port:, db_name:, db_user:, db_password:,
16
17
  tacview_host:, tacview_port:, tacview_password:,
17
18
  tacview_client_name:, verbose_logging:, thread_count:,
18
- populate_airfields:, whitelist: nil)
19
+ populate_airfields:, whitelist: nil, cinc_enabled:, cinc_port:)
19
20
  Datastore.instance.configure do |config|
20
21
  config.host = db_host
21
22
  config.port = db_port
@@ -34,13 +35,20 @@ module TacScribe
34
35
  @threads = {}
35
36
  @whitelist = Set.new(IO.read(whitelist).split) if whitelist
36
37
 
37
- @client = TacviewClient::Client.new(
38
+ @tacview_client = TacviewClient::Client.new(
38
39
  host: tacview_host,
39
40
  port: tacview_port,
40
41
  password: tacview_password,
41
42
  processor: @event_queue,
42
43
  client_name: tacview_client_name
43
44
  )
45
+
46
+ if cinc_enabled
47
+ @cinc_client = Cinc::Client.new(
48
+ host: tacview_host,
49
+ port: cinc_port
50
+ )
51
+ end
44
52
  end
45
53
 
46
54
  # Starts processing and reconnects if the client was disconnected.
@@ -55,16 +63,19 @@ module TacScribe
55
63
  Datastore.instance.truncate_table
56
64
  Cache.instance.clear
57
65
  start_processing_threads
66
+ start_cinc_thread
58
67
  start_db_sync_thread
59
68
  start_reporting_thread
60
69
  populate_airfields if @populate_airfields
61
70
  @threads.each_pair do |key, _value|
62
71
  puts "#{key} thread started"
63
72
  end
64
- @client.connect
73
+ @tacview_client.connect
65
74
  # If this code is executed it means we have been disconnected without
66
75
  # exceptions. We will still sleep to stop a retry storm. Just not as
67
76
  # long.
77
+ puts "Disconnected from Tacview"
78
+ kill_threads
68
79
  sleep 10
69
80
  # Rescuing reliably from Net::HTTP is a complete bear so rescue
70
81
  # StandardError. It ain't pretty but it is reliable. We will puts
@@ -101,6 +112,30 @@ module TacScribe
101
112
  @threads[:processing] = event_processor_thread
102
113
  end
103
114
 
115
+ def start_cinc_thread
116
+ return unless @cinc_client
117
+ cinc_thread = Thread.new do
118
+ loop do
119
+ @cinc_client.connect
120
+ while true
121
+ @cinc_client.get_airbases.each do |airbase|
122
+ @event_queue.update_object Hash[airbase.map{ |k, v| [k.to_sym, v] }]
123
+ end
124
+ sleep 60
125
+ end
126
+ rescue StandardError => e
127
+ puts 'Exception in cinc thread'
128
+ puts e.message
129
+ puts e.backtrace
130
+ sleep 30
131
+ next
132
+ end
133
+ end
134
+
135
+ cinc_thread.name = 'Cinc Processor'
136
+ @threads[:cinc] = cinc_thread
137
+ end
138
+
104
139
  def start_db_sync_thread
105
140
  db_write_thread = Thread.new do
106
141
  loop do
@@ -152,7 +187,7 @@ module TacScribe
152
187
  altitude: BigDecimal(airfield['alt'].to_s),
153
188
  type: 'Ground+Static+Aerodrome',
154
189
  name: airfield['name'],
155
- coalition: 2
190
+ coalition: 0 # Neutral
156
191
  )
157
192
  end
158
193
  end
@@ -28,6 +28,7 @@ module TacScribe
28
28
  rescue StandardError => e
29
29
  puts wrapped_event
30
30
  puts e.inspect
31
+ puts e.backtrace
31
32
  next
32
33
  end
33
34
  end
@@ -65,8 +66,11 @@ module TacScribe
65
66
  # @option event [BigDecimal] :altitude The object altitude above sea level
66
67
  # in meters to 1 decimal place.
67
68
  def update_object(event, time)
68
- return if ignore_unit?(even)
69
+ return if ignore_unit?(event)
69
70
 
71
+ # Hack to make sure the :name field is present so that it is included
72
+ # in the SQL
73
+ event[:name] = nil unless event.has_key?(:name)
70
74
  event[:game_time] = time
71
75
 
72
76
  self.events_processed += 1
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TacScribe
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.3.rc1'
5
5
  end
@@ -4,6 +4,8 @@ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'tac_scribe/version'
6
6
 
7
+ puts "RUBY_PLATFORM = #{RUBY_PLATFORM}"
8
+
7
9
  Gem::Specification.new do |spec|
8
10
  spec.name = 'tac_scribe'
9
11
  spec.version = TacScribe::VERSION
@@ -24,6 +26,8 @@ Gem::Specification.new do |spec|
24
26
 
25
27
  spec.metadata['yard.run'] = 'yri'
26
28
 
29
+ spec.platform = RUBY_PLATFORM == 'java' ? 'java' : 'ruby'
30
+
27
31
  if RUBY_PLATFORM == 'java'
28
32
  spec.add_dependency 'activerecord-jdbcpostgresql-adapter'
29
33
  else
@@ -39,6 +43,7 @@ Gem::Specification.new do |spec|
39
43
  spec.add_dependency 'haversine', '~>0.3'
40
44
  spec.add_dependency 'sequel-postgis-georuby', '0.1.2'
41
45
  spec.add_dependency 'tacview_client', '~>0.1'
46
+ spec.add_dependency 'cinc', '~>0.1'
42
47
 
43
48
  spec.add_development_dependency 'bundler', '~> 2.0'
44
49
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -46,4 +51,5 @@ Gem::Specification.new do |spec|
46
51
  spec.add_development_dependency 'rubocop', '~>0.73'
47
52
  spec.add_development_dependency 'simplecov', '~>0.17'
48
53
  spec.add_development_dependency 'yard', '~>0.9'
54
+ spec.add_development_dependency 'pry-byebug', '~>3.9'
49
55
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tac_scribe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.3.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeffrey Jones
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-19 00:00:00.000000000 Z
11
+ date: 2020-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: cinc
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.1'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: bundler
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +206,20 @@ dependencies:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0.9'
209
+ - !ruby/object:Gem::Dependency
210
+ name: pry-byebug
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '3.9'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '3.9'
195
223
  description: Write Tacview data to PostGIS database
196
224
  email:
197
225
  - jeff@jones.be
@@ -244,11 +272,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
272
  version: '0'
245
273
  required_rubygems_version: !ruby/object:Gem::Requirement
246
274
  requirements:
247
- - - ">="
275
+ - - ">"
248
276
  - !ruby/object:Gem::Version
249
- version: '0'
277
+ version: 1.3.1
250
278
  requirements: []
251
- rubygems_version: 3.0.3
279
+ rubygems_version: 3.1.2
252
280
  signing_key:
253
281
  specification_version: 4
254
282
  summary: Write Tacview data to PostGIS database