{"id":18714887,"url":"https://github.com/diegoclair/log-parser","last_synced_at":"2025-11-10T04:30:20.311Z","repository":{"id":227915188,"uuid":"768348768","full_name":"diegoclair/log-parser","owner":"diegoclair","description":null,"archived":false,"fork":false,"pushed_at":"2024-03-15T21:04:30.000Z","size":125,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-28T09:39:14.264Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/diegoclair.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-06T23:16:33.000Z","updated_at":"2024-03-15T04:30:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"1a5da382-a9ab-4f18-b94a-d0c0ba9ffe1b","html_url":"https://github.com/diegoclair/log-parser","commit_stats":null,"previous_names":["diegoclair/log-parser"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diegoclair%2Flog-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diegoclair%2Flog-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diegoclair%2Flog-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diegoclair%2Flog-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/diegoclair","download_url":"https://codeload.github.com/diegoclair/log-parser/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239576744,"owners_count":19662114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T13:06:40.656Z","updated_at":"2025-11-10T04:30:20.278Z","avatar_url":"https://github.com/diegoclair.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ch1 align=\"center\"\u003eQuake III Arena Log Parser\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n   \u003ca href='https://github.com/diegoclair/log-parser/commits/main'\u003e\n\t\u003cimg src=\"https://img.shields.io/github/last-commit/diegoclair/log-parser?style=flat\u0026logo=git\u0026logoColor=white\u0026color=0080ff\" alt=\"last-commit\"\u003e\n   \u003c/a\u003e\n   \u003ca href=\"https://github.com/diegoclair/log-parser/actions\"\u003e\n     \u003cimg src=\"https://github.com/diegoclair/log-parser/actions/workflows/ci.yaml/badge.svg\" alt=\"build status\"\u003e\n   \u003c/a\u003e\n  \u003ca href='https://goreportcard.com/badge/github.com/diegoclair/log-parser'\u003e\n     \u003cimg src='https://goreportcard.com/badge/github.com/diegoclair/log-parser' alt='Go Report'/\u003e\n    \u003c/a\u003e\n\u003cp\u003e\n  \n## Description \nThis project is a log parser for Quake III Arena, a popular first-person shooter game released in 1999. \n\nThe parser can extract a variety of information from the game logs, including:\n* From each match, it can extract:\n   * Player names\n   * Total kills by player\n   * Total kills from match\n   * Total deaths by it cause\n\n### Key Features\n* **Clean Architecture**: The project is designed using the principles of Clean Architecture, which promotes separation of concerns, modularity, and testability.\n* **Comprehensive Parsing**: The parser can extract a wide range of information from the game logs.\n* **Well-Tested**: All layers of the codebase are tested to ensure reliability and robustness.\n\n### Project architecture:\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src='./.github/assets/architecture.png' /\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\nFor the presentation layer, which I refer to as the transport layer, its purpose is to handle data transportation. It is responsible for receiving line text and send to application layer, where it will orchestrate the business logic.\n\n### Result\nThe parsed data is written to a JSON file named `result.json`. This file contains information about each match, structured as follows:\n\n```\n{\n  \"game_001\": {                        // Identifier for the match (e.g., \"game_001\")\n        \"total_kills\": 11,             // Total number of kills in the match\n        \"players\": [                   // List of players who participated\n            \"Isgalamido\", \n            \"Mocinha\"\n        ],\n        \"kills\": {                     // Kills attributed to each player (can be negative for if killed by \u003cworld\u003e)\n            \"Isgalamido\": -2\n            \"Mocinha\": 5\n        },\n        \"kills_by_means\": {            // Kills by means of damage (e.g., weapon types / death causes)\n            \"MOD_FALLING\": 1,\n            \"MOD_ROCKET_SPLASH\": 3,\n            \"MOD_TRIGGER_HURT\": 7\n        }\n    },\n}\n``` \n## Observations:\n\n* **Suicides**: Suicides (kills by the player on themself) are not currently counted for the player. But it is counted on game TotalKills. Ex:\n   * `22:18 Kill: 2 2 7: Isgalamido killed Isgalamido by MOD_ROCKET_SPLASH`  \n* **Change Name**: the parser currently tracks the player name used most recently during the match, as player names can change in-game.\n\n## 💻 Getting Started \n\n### Prerequisites ❗\n* An installation of Go 1.21.0 or later. For installation instructions, see [Installing Go](https://go.dev/doc/install).\n* A log file from Game lll Arena\n\n### ▶️ Launching the Application \nTo execute the application, run the command bellow in the root path: \n```bash\nmake start\n```\nOnce you see the message a log with `Execution time:`, then the program was executed.\n\n### ▶️ Specifying a Log File Path:\nBy default, the application will use the `qgames.log` file located in the project repository. However, you can specify a different log file path using the logpath flag:\n```bash\nmake start logpath=./somelocation/log.log\n```\n* The logpath flag allows you to specify the path to the Quake III Arena log file you want to parse.\n* In this example, the application will use the file located at ./somelocation/log.log.\n* You can use absolute or relative paths for the logpath flag.\n* Ensure the specified file exists and has read permissions.\n\n## Running tests\n```bash\nmake tests\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiegoclair%2Flog-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiegoclair%2Flog-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiegoclair%2Flog-parser/lists"}