2023-04-27 00:04:36 -04:00
2023-07-05 11:39:31 -07:00
2023-07-05 11:39:31 -07:00

Arma 3 Attendance Tracker

Setup

You will need a running MySQL or MariaDB instance.

The following SQL commands will set up the necessary tables for the application. You can run them from the MySQL command line or from a tool like phpMyAdmin.

In future, an ORM will be used to set this up automatically.

CREATE DATABASE `arma3_attendance` /*!40100 DEFAULT CHARACTER SET utf8mb3 */;

USE `arma3_attendance`;

-- a3server.missions definition
CREATE TABLE `missions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `world_id` int(11) DEFAULT NULL,
  `mission_hash` varchar(100) NOT NULL DEFAULT '',
  `mission_name` varchar(100) NOT NULL,
  `mission_name_source` varchar(100) DEFAULT NULL,
  `briefing_name` varchar(100) DEFAULT NULL,
  `on_load_name` varchar(100) DEFAULT NULL,
  `author` varchar(100) DEFAULT NULL,
  `server_name` varchar(100) DEFAULT NULL,
  `server_profile` varchar(100) DEFAULT NULL,
  `mission_start` datetime DEFAULT NULL COMMENT 'In UTC',
  PRIMARY KEY (`id`),
  KEY `mission_hash` (`mission_hash`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3;

-- arma3_attendance.attendance definition
CREATE TABLE `attendance` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `join_time` datetime DEFAULT NULL COMMENT 'Stored in UTC',
  `disconnect_time` datetime DEFAULT NULL COMMENT 'Stored in UTC',
  `mission_hash` varchar(100) DEFAULT NULL,
  `event_type` varchar(100) NOT NULL,
  `player_id` varchar(30) NOT NULL,
  `player_uid` varchar(100) NOT NULL,
  `profile_name` varchar(100) NOT NULL,
  `steam_name` varchar(100) DEFAULT NULL,
  `is_jip` tinyint(4) DEFAULT NULL,
  `role_description` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `mission_hash` (`mission_hash`),
  CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`mission_hash`) REFERENCES `missions` (`mission_hash`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3;


-- a3server.worlds definition
CREATE TABLE `worlds` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `author` varchar(100) DEFAULT NULL,
  `display_name` varchar(100) DEFAULT NULL,
  `world_name` varchar(100) NOT NULL,
  `world_name_original` varchar(100) DEFAULT NULL,
  `world_size` int(11) DEFAULT NULL,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  `workshop_id` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `world_name` (`world_name`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3;

Finally, copy config.example.json to config.json and update it with your database credentials and path.

QUERIES

Show missions with attendance

This will retrieve a view showing all missions with attendance data, sorted by the most recent mission joins first. Mission events without a mission disconnect_time (due to server crash or in-progress mission) will be ignored.

select
    a.server_profile as Server,
    a.briefing_name as "Mission Name",
    a.mission_start as "Start Time",
    b.display_name as "World",
    c.profile_name as "Player Name",
    c.player_uid as "Player UID",
    TIMESTAMPDIFF(
        MINUTE,
        c.join_time,
        c.disconnect_time
    ) as "Play Time (m)",
    c.join_time as "Join Time",
    c.disconnect_time as "Leave Time"
from missions a
    LEFT JOIN worlds b ON a.world_id = b.id
    LEFT JOIN attendance c ON a.mission_hash = c.mission_hash
where
    c.event_type = 'Mission'
    AND c.disconnect_time IS NOT NULL
    AND TIMESTAMPDIFF(
        MINUTE,
        c.join_time,
        c.disconnect_time
    ) > 0
Description
Tracks player joins/leaves to the server and mission to a MySQL/MariaDB instance.
Readme 80 MiB
Languages
C++ 70.6%
Go 22.2%
SQF 7.2%