What is This#
首先我们来了解一下 Account, Realm, Character 这三个概念.
在魔兽世界服务器领域, 一个 Account 是一个玩家账号. 例如一个玩家在美服, 欧服, 亚服可以有不同的账号. 每次登录游戏时输入账号密码的时候的账号就是这里的 Account.
用账号登录后, 就会进入到选择服务器的界面, 例如美服可以有 20 个服务器. 这里的一个服务器就叫做一个 Realm. 你在一个 Realm 中创建的角色只能在这个 Realm 中使用.
在一个 Realm 中你可以创建 Character 游戏角色. 比如你的战士号就是一个 Character.
这个库是一个用 Python 对象来描述 World of Warcraft 账户的库. 它允许你将账户信息保存在一个 YAML 格式的文件中, 然后用 Python 来将数据读到内存中, 最后自动创建一个 enum 的脚本, 里面有着对所有的 Account, Realm, Character 的引用, 使得你在其他模块中可以方便的利用 IDE 的自动补全对其进行引用.
下面这是一个 YAML 文件的例子. 里面定义了 2 个 Account, 2 个 Realm, 一共 8 个 Character.
tests/dataset.yml
1acc1:
2 realm1:
3 - char111
4 - char112
5 realm2:
6 - char121
7 - char122
8acc2:
9 realm1:
10 - char211
11 - char212
12 realm2:
13 - char221
14 - char222
下面这个模块可以将上面的 YAML 文件读取到内存中. 作为模块使用, if __name__ == "__main__": 以外的代码可以被 import. 作为脚本使用, 它能生成一个 enum 的模块.
tests/dataset.py
1# -*- coding: utf-8 -*-
2
3from pathlib import Path
4from wow_acc.api import Dataset
5
6dir_here = Path(__file__).absolute().parent
7ds = Dataset.from_yaml(dir_here.joinpath("dataset.yml"))
8
9if __name__ == "__main__":
10 path = dir_here.joinpath("constants.py")
11 content = ds.to_module(
12 import_line="from dataset import ds",
13 )
14 path.write_text(content)
下面就是生成的 enum 模块. 你可以在其他模块中引用这个模块, 然后使用 IDE 的自动补全来引用其中的 Account, Realm, Character. 并且每当你修改了 YAML 文件后, 你可以轻松地重新生成这个 enum 模块.
tests/constants.py
1# -*- coding: utf-8 -*-
2
3from dataset import ds
4
5
6# fmt: off
7class AccountEnum:
8 acc1 = ds.accounts["acc1"]
9 acc2 = ds.accounts["acc2"]
10
11
12class RealmEnum:
13 acc1_realm1 = ds.accounts["acc1"].realms_mapper["realm1"]
14 acc1_realm2 = ds.accounts["acc1"].realms_mapper["realm2"]
15 acc2_realm1 = ds.accounts["acc2"].realms_mapper["realm1"]
16 acc2_realm2 = ds.accounts["acc2"].realms_mapper["realm2"]
17
18
19class CharacterEnum:
20 acc1_realm1_char111 = ds.accounts["acc1"].realms_mapper["realm1"].characters_mapper["char111"]
21 acc1_realm1_char112 = ds.accounts["acc1"].realms_mapper["realm1"].characters_mapper["char112"]
22 acc1_realm2_char121 = ds.accounts["acc1"].realms_mapper["realm2"].characters_mapper["char121"]
23 acc1_realm2_char122 = ds.accounts["acc1"].realms_mapper["realm2"].characters_mapper["char122"]
24 acc2_realm1_char211 = ds.accounts["acc2"].realms_mapper["realm1"].characters_mapper["char211"]
25 acc2_realm1_char212 = ds.accounts["acc2"].realms_mapper["realm1"].characters_mapper["char212"]
26 acc2_realm2_char221 = ds.accounts["acc2"].realms_mapper["realm2"].characters_mapper["char221"]
27 acc2_realm2_char222 = ds.accounts["acc2"].realms_mapper["realm2"].characters_mapper["char222"]
28# fmt: on