# Diarkis Module

## 概要

**Diarkis ランタイム・ライブラリ**では低レベルな機能が提供されており、実際にアプリケーションとして動かすためにはもう少し追加機能の実装が必要となります。\
**Diarkis Module** は ランタイムをアプリケーションに簡単に組み込めるように **Diarkis ランタイム・ライブラリ** を使用するために必要な実装や便利な機能を実装したフレームワークです。\
パッケージ内の以下の場所にソース・コードが配置されています。

`diarkis-module`

## 基本構造とファイル構成

**Diarkis Module** は大きく以下の４つの機能に分かれています。

* Diarkis Interface
  * Diarkis サーバーへの接続や接続毎に各モジュールを使用するための状態などを管理するクラスで、Diarkis サーバーへの接続ごとにインスタンスを作成します。
  * `diarkis-module/Client/Private/DiarkisInterfaceBase.cpp` に実装があります。
* 各モジュールごとに実装
  * Diarkis"**ModuleName**"Base という名前で **ModuleName** に該当するモジュールの機能を実装しているクラスです。
  * ユーザーはこのクラスを継承してカスタマイズすることによりアプリケーション独自の挙動を実装することができます。
  * `diarkis-module/Client/Private` 配下に実装があります。
* ロギング関連機能
  * **Diarkis ランタイム・ライブラリ** や **Diarkis Module** のログ出力をサポートする機能です。
  * `diarkis-module/Client/Private/logging` に関連ソースコードが配置されています。
* 補助機能
  * 通常の HTTP アクセスやファイル操作など、Diarkis の機能に直接かかわらない補助機能です。
  * `diarkis-module/Client/Private/utils` に関連ソース・コードが配置されています。

## 各モジュールの使用方法について

**Diarkis Module** から Diarkis の各モジュールの機能を使用する場合は以下の各モジュールのページを参照してください。

* Room モジュール
* MatchMaker モジュール
* Field モジュール
* P2P モジュール
* DM (Direct Message) モジュール
* Session モジュール
* Group モジュール

## Diarkis Module の使い方

Diarkis Module の基本的な使い方、アプリケーションごとのカスタマイズ方法については以下のページを参照してください。

* [Diarkis Module の初期化と終了](https://help.diarkis.io/diarkis-client/diarkis-module/how-to-init-deinit)
* [Diarkis Module のカスタマイズ](https://help.diarkis.io/diarkis-client/diarkis-module/how-to-customize-module)
* [Diarkis Module のロギング・システム](https://help.diarkis.io/diarkis-client/diarkis-module/log-output)
* [マイグレーション](https://help.diarkis.io/diarkis-client/diarkis-module/migration)

## Diarkis Module が使用するリソース

Diarkis Module は内部で以下のリソースを使用します。

* [Diarkis のスレッド](https://help.diarkis.io/diarkis-client/diarkis-module/diarkis-nosureddo)

## 注意点

* **Diarkis Module** はソース・コードで提供されているため、ユーザーが直接コードを変更してカスタマイズすることも可能です。しかし弊社都合により実装が大きく変更されることがあり、バージョンアップの際にマージが困難になる可能性があります。改変して利用する際はあらかじめご了承ください。
* **Diarkis Module** の API はスレッド・セーフでは**ありません**。複数スレッドで **Diarkis Module** を利用する場合はアプリケーション側で排他制御を行ってください。
