pedrofurtado/quake-log-parser

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# Quake Log Parser

[![Maintainability](https://api.codeclimate.com/v1/badges/8bbcb90abf1f392d7e68/maintainability)](https://codeclimate.com/github/pedrofurtado/quake-log-parser/maintainability)
![CI](https://github.com/pedrofurtado/quake-log-parser/actions/workflows/ci.yml/badge.svg)
[![codecov](https://codecov.io/gh/pedrofurtado/quake-log-parser/graph/badge.svg?token=DUC0CORI0N)](https://codecov.io/gh/pedrofurtado/quake-log-parser)

Ruby gem for quake log parsing.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'quake-log-parser'
```

And then execute:

    bundle install

Or install it yourself as:

    gem install quake-log-parser

## Usage - Log reader

```ruby
require 'quake-log-parser'

if defined?(Rails)
  QuakeLogParser::Logger.logger = Rails.logger
else
  QuakeLogParser::Logger.logger = Logger.new($stdout)
end

parser = QuakeLogParser::LogReader.new('/path/to/your/quake.log')
parser.read

puts JSON.pretty_generate(parser.results)
```

## Usage - Emulated Kafka topic reader

```ruby
=begin
All kafka topic messages must have this structure:

{
  "lines": [
    "content of line 01 with slashs escaped",
    "content of line 02 with slashs escaped",
    "content of line 03 with slashs escaped",
    "..."
  ]
}

Example of message (with slashs escaped):

{
  "lines": [
    "0:00 InitGame: \\sv_floodProtect\\1\\sv_maxPing\\0\\sv_minPing\\0\\sv_maxRate\\10000\\sv_minRate\\0\\sv_hostname\\Code Miner Server\\g_gametype\\0\\sv_privateClients\\2\\sv_maxclients\\16\\sv_allowDownload\\0\\dmflags\\0\fraglimit\\20\\timelimit\\15\\g_maxGameClients\\0\\capturelimit\\8\\version\\ioq3 1.36 linux-x86_64 Apr 12 2009\\protocol\\68\\mapname\\q3dm17\\gamename\baseq3\\g_needpass\\0",
    "20:34 ClientUserinfoChanged: 2 n\\Isgalamido\\t\\0\\model\\xian/default\\hmodel\\xian/default\\g_redteam\\g_blueteam\\c1\\4\\c2\\5\\hc\\100\\w\\0\\l\\0\\tt\\0\\tl\\0",
    "20:54 Kill: 1022 2 22: <world> killed Isgalamido by MOD_TRIGGER_HURT",
    "21:51 ClientUserinfoChanged: 3 n\\Dono da Bola\\t\\0\\model\\sarge/krusade\\hmodel\\sarge/krusade\\g_redteam\\g_blueteam\\c1\\5\\c2\\5\\hc\\95\\w\\0\\l\\0\\tt\\0\\tl\\0",
    "22:06 Kill: 2 3 7: Isgalamido killed Dono da Bola by MOD_ROCKET_SPLASH"
  ]
}
=end

require 'quake-log-parser'
require 'ostruct'

if defined?(Rails)
  QuakeLogParser::Logger.logger = Rails.logger
else
  QuakeLogParser::Logger.logger = Logger.new($stdout)
end

quake_log_lines = [
  'content of line 01 with slashs escaped',
  'content of line 02 with slashs escaped',
  'content of line 03 with slashs escaped',
  '...'
]

emulated_messages_from_kafka = [
  OpenStruct.new(payload: { 'lines' => quake_log_lines })
]

parser = QuakeLogParser::KafkaTopicReader.new(emulated_messages_from_kafka)
parser.read

puts JSON.pretty_generate(parser.results)
```

## Usage - Kafka producer inside Karafka console

```ruby
# Enter the Karafka console with the command below:
# docker-compose up --build -d (Wait Kafka components and Karafka consumer to be ready)
# docker container exec -it quake-log-parser_kafka_consumer_1 bundle exec karafka console

# Then, open a second terminal to see logs of Karafka consumer with the command below:
# docker container logs -f quake-log-parser_kafka_consumer_1 | grep -i 'quake'

# Then, run the commands below to produce a message to a Kafka topic:

topic_name = 'quake_log_parser_topic'
key = SecureRandom.uuid
payload = {
  "lines" => [
    "0:00 InitGame: \\sv_floodProtect\\1\\sv_maxPing\\0\\sv_minPing\\0\\sv_maxRate\\10000\\sv_minRate\\0\\sv_hostname\\Code Miner Server\\g_gametype\\0\\sv_privateClients\\2\\sv_maxclients\\16\\sv_allowDownload\\0\\dmflags\\0\fraglimit\\20\\timelimit\\15\\g_maxGameClients\\0\\capturelimit\\8\\version\\ioq3 1.36 linux-x86_64 Apr 12 2009\\protocol\\68\\mapname\\q3dm17\\gamename\baseq3\\g_needpass\\0",
    "20:34 ClientUserinfoChanged: 2 n\\Isgalamido\\t\\0\\model\\xian/default\\hmodel\\xian/default\\g_redteam\\g_blueteam\\c1\\4\\c2\\5\\hc\\100\\w\\0\\l\\0\\tt\\0\\tl\\0",
    "20:54 Kill: 1022 2 22: <world> killed Isgalamido by MOD_TRIGGER_HURT",
    "21:51 ClientUserinfoChanged: 3 n\\Dono da Bola\\t\\0\\model\\sarge/krusade\\hmodel\\sarge/krusade\\g_redteam\\g_blueteam\\c1\\5\\c2\\5\\hc\\95\\w\\0\\l\\0\\tt\\0\\tl\\0",
    "22:06 Kill: 2 3 7: Isgalamido killed Dono da Bola by MOD_ROCKET_SPLASH"
  ]
}
producer = Karafka.producer.produce_sync(topic: topic_name, payload: payload.to_json, key: key)
Karafka.logger.info("[QuakeLogParser::KafkaTopicProducer] send_sync topic=#{topic_name} key=#{key} offset=#{producer.offset} partition=#{producer.partition} payload=#{payload}")
```

## Execute tests/specs

To execute gem tests locally, use Docker with the commands below:

```bash
git clone https://github.com/pedrofurtado/quake-log-parser
cd quake-log-parser/
docker build -t quake-log-parser_specs .

# Then, run this command how many times you want,
# after editing local files, and so on, to get
# feedback from test suite of gem.
docker run --rm -v $(pwd):/app/ -it quake-log-parser_specs

# Or, if you want to run a example of usage of gem,
# you can run the command below.
docker run --rm -v $(pwd):/app/ -it quake-log-parser_specs bundle exec ruby real_example_to_run.rb
```

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/pedrofurtado/quake-log-parser. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/pedrofurtado/quake-log-parser/blob/master/CODE_OF_CONDUCT.md).

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the quake-log-parser project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/pedrofurtado/quake-log-parser/blob/master/CODE_OF_CONDUCT.md).