Skip to content

Commit

Permalink
refactor(AttrObject): adjust struct
Browse files Browse the repository at this point in the history
  • Loading branch information
mystringEmpty committed Jan 27, 2024
1 parent 746d34b commit a3aa41f
Show file tree
Hide file tree
Showing 38 changed files with 970 additions and 952 deletions.
26 changes: 13 additions & 13 deletions Dice/BlackListManager.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* 黑名单明细
* 更数据库式的管理
* Copyright (C) 2019-2023 String.Empty
* Copyright (C) 2019-2024 String.Empty
*/
#include <mutex>
#include <thread>
Expand All @@ -23,7 +23,7 @@ using Manager = DDBlackManager;
using Factory = DDBlackMarkFactory;

//判断信任
int isReliable(long long uid)
static int isReliable(long long uid)
{
if (!uid)return 0;
if (uid == console)return 255;
Expand All @@ -46,14 +46,14 @@ void checkGroupWithBlackQQ(const DDBlackMark& mark, long long llQQ)
for (auto& [id, grp] : ChatList)
{
int authSelf;
if (!grp.getLst() || grp.isset("忽略") || !grp.isGroup
if (!grp->getLst() || grp->is("忽略")
|| !(authSelf = DD::getGroupAuth(id, console.DiceMaid, 0)))continue;
if (DD::isGroupMember(grp.ID, llQQ, false)) {
if (DD::isGroupMember(grp->ID, llQQ, false)) {
strNotice = printGroup(id);
if (grp.isset("协议无效")) {
if (grp->is("协议无效")) {
strNotice += "群协议无效";
}
else if (grp.isset("免黑")) {
else if (grp->is("免黑")) {
if (mark.isSource(console.DiceMaid) && !mark.isType("local"))DD::sendGroupMsg(id, mark.warning());
strNotice += "群免黑";
}
Expand All @@ -68,11 +68,11 @@ void checkGroupWithBlackQQ(const DDBlackMark& mark, long long llQQ)
else if (authSelf > authBlack)
{
DD::sendGroupMsg(id, mark.warning());
grp.leave("发现新增黑名单管理员" + printUser(llQQ) + "\n" + getMsg("strSelfName") + "将预防性退群");
grp->leave("发现新增黑名单管理员" + printUser(llQQ) + "\n" + getMsg("strSelfName") + "将预防性退群");
strNotice += "对方群权限较高,已退群";
this_thread::sleep_for(1s);
}
else if (grp.isset("免清"))
else if (grp->is("免清"))
{
if (mark.isSource(console.DiceMaid) && !mark.isType("local"))AddMsgToQueue(
mark.warning(), { 0, id });
Expand All @@ -81,7 +81,7 @@ void checkGroupWithBlackQQ(const DDBlackMark& mark, long long llQQ)
else if (console["LeaveBlackQQ"])
{
DD::sendGroupMsg(id, mark.warning());
grp.leave("发现新增黑名单成员" + printUser(llQQ) + "(同等群权限)\n" + getMsg("strSelfName") + "将预防性退群");
grp->leave("发现新增黑名单成员" + printUser(llQQ) + "(同等群权限)\n" + getMsg("strSelfName") + "将预防性退群");
strNotice += "已退群";
this_thread::sleep_for(1s);
}
Expand Down Expand Up @@ -846,7 +846,7 @@ void DDBlackManager::reset_qq_danger(long long llqq)
if (Enabled)
{
if (!isLoadingExtern)console.log("已消除" + printUser(llqq) + "的危险等级", 0b10, printSTNow());
if (UserList.count(llqq))AddMsgToQueue(getMsg("strBlackQQDelNotice", AttrVars{ {"uid",llqq}, {"user_nick", getName(llqq)}}), llqq);
if (UserList.count(llqq))AddMsgToQueue(getMsg("strBlackQQDelNotice", std::make_shared<AnysTable>(AttrVars{ {"uid",llqq}, {"user_nick", getName(llqq)}})), llqq);
}
}
}
Expand Down Expand Up @@ -885,10 +885,10 @@ bool DDBlackManager::up_qq_danger(long long llqq, DDBlackMark& mark)
{
if (!mQQDanger.count(llqq) && UserList.count(llqq) && mark.danger == 2)
mark.note.empty()
? AddMsgToQueue(getMsg("strBlackQQAddNotice", AttrVars{ {"uid",llqq}, {"user_nick", getName(llqq)}}), llqq)
: AddMsgToQueue(getMsg("strBlackQQAddNoticeReason", AttrVars{
? AddMsgToQueue(getMsg("strBlackQQAddNotice", std::make_shared<AnysTable>(AttrVars{ {"uid",llqq}, {"user_nick", getName(llqq)}})), llqq)
: AddMsgToQueue(getMsg("strBlackQQAddNoticeReason", std::make_shared<AnysTable>(AttrVars{
{"uid",llqq}, {"reason", mark.note}, {"user_nick", getName(llqq)}
}), llqq);
})), llqq);
if (!isLoadingExtern) {
console.log(getMsg("strSelfName") + "已将" + printUser(llqq) + "危险等级提升至" + to_string(mark.danger), 0b10,
printSTNow());
Expand Down
71 changes: 35 additions & 36 deletions Dice/CharacterCard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ AttrShape::AttrShape(const tinyxml2::XMLElement* node, bool isUTF8) {
defVal = AttrVar::parse(s);
}
}
AttrVar AttrShape::init(const CharaCard* pc) {
AttrVar AttrShape::init(CharaCard* pc) {
if (textType == TextType::JavaScript) {
return js_context_eval(defVal, *pc);
return js_context_eval(defVal, pc->shared_from_this());
}
else if (textType == TextType::Dicexp && !defVal.is_null()) {
if (auto exp{ fmt->format(defVal,*pc) }; exp.is_text()) {
if (auto exp{ fmt->format(defVal, pc->shared_from_this()) }; exp.is_text()) {
return pc->cal(exp);
}
else return exp;
Expand Down Expand Up @@ -192,16 +192,16 @@ ptr<CardTemp> CharaCard::getTemplet()const{
}

void CharaCard::update() {
(*dict)["__Update"] = (long long)time(nullptr);
dict["__Update"] = (long long)time(nullptr);
}
void CharaCard::setName(const string& strName) {
Attr["__Name"] = Name = strName;
dict["__Name"] = Name = strName;
}
void CharaCard::setType(const string& strType) {
Attr["__Type"] = strType;
dict["__Type"] = strType;
}
AttrVar CharaCard::get(const string& key)const {
if (dict->count(key))return at(key);
AttrVar CharaCard::get(const string& key){
if (dict.count(key))return dict.at(key);
if (auto temp{ getTemplet() }; temp->canGet(key)) {
return temp->AttrShapes.at(key).init(this);
}
Expand All @@ -213,42 +213,42 @@ int CharaCard::set(string key, const AttrVar& val) {
if (val.is_text() && val.text.length() > 256)return -11;
key = standard(key);
if (getTemplet()->equalDefault(key, val)){
if (has(key)) dict->erase(key);
if (has(key)) dict.erase(key);
else return -1;
}
else {
Attr[key] = val;
dict[key] = val;
}
update();
return 0;
}

string CharaCard::print(const string& key)const {
if (dict->count(key))return dict->at(key).print();
string CharaCard::print(const string& key){
if (dict.count(key))return dict.at(key).print();
if (auto temp{ getTemplet() }; temp->canGet(key)) {
return temp->AttrShapes.at(key).init(this).print();
}
return {};
}
std::optional<string> CharaCard::show(string key) const {
std::optional<string> CharaCard::show(string key) {
if (has(key) || has(key = standard(key))) {
if (auto res{ get(key) }; !res.is_null())return res.print();
}
return std::nullopt;
}

bool CharaCard::has(const string& key)const {
return (dict->count(key) && !dict->at(key).is_null())
return (dict.count(key) && !dict.at(key).is_null())
|| getTemplet()->canGet(key);
}

//求key对应掷骰表达式
string CharaCard::getExp(string& key, std::unordered_set<string> sRef){
sRef.insert(key = standard(key));
auto temp{ getTemplet() };
auto val = dict->find("&" + key);
if (val != dict->end())return escape(val->second.to_str(), sRef);
else if ((val = dict->find(key)) != dict->end())return escape(val->second.to_str(), sRef);
auto val = dict.find("&" + key);
if (val != dict.end())return escape(val->second.to_str(), sRef);
else if ((val = dict.find(key)) != dict.end())return escape(val->second.to_str(), sRef);
else if (auto exp = temp->AttrShapes.find("&" + key); exp != temp->AttrShapes.end())return escape(exp->second.init(this).to_str(), sRef);
else if (auto exp = temp->AttrShapes.find(key); exp != temp->AttrShapes.end())return escape(exp->second.init(this).to_str(), sRef);
return "0";
Expand All @@ -257,7 +257,7 @@ bool CharaCard::countExp(const string& key)const {
return key[0] == '&' ? (has(key) || getTemplet()->canGet(key))
: (has("&" + key) || getTemplet()->canGet("&" + key));
}
std::optional<int> CharaCard::cal(string exp)const {
std::optional<int> CharaCard::cal(string exp){
if (exp[0] == '&'){
if (auto res{ get(exp.substr(1)) };res.is_numberic()) {
return res.to_int();
Expand Down Expand Up @@ -298,9 +298,9 @@ void CharaCard::buildv(string para)
}

void CharaCard::clear() {
dict = std::make_shared<AttrVars>(AttrVars{{"__Type",Attr["__Type"]},{"__Name",Attr["__Name"]}} );
dict = AttrVars{{"__Type",dict["__Type"]},{"__Name",dict["__Name"]}};
}
[[nodiscard]] string CharaCard::show(bool isWhole) const {
[[nodiscard]] string CharaCard::show(bool isWhole){
std::set<string> sDefault;
ResList Res;
for (const auto& list : getTemplet()->vBasicList) {
Expand All @@ -315,7 +315,7 @@ void CharaCard::clear() {
Res << subList.show();
}
string strAttrRest;
for (const auto& [key,val] : *dict) {
for (const auto& [key,val] : dict) {
if (sDefault.count(key) || key[0] == '_'
|| (isWhole && val.type == AttrVar::Type::Number))continue;
strAttrRest += key + ":" + val.print() + (val.type == AttrVar::Type::Number
Expand Down Expand Up @@ -350,7 +350,7 @@ void CharaCard::writeb(std::ofstream& fout) const {
fwrite(fout, string("Name"));
fwrite(fout, Name);
fwrite(fout, string("Attrs"));
AttrObject::writeb(fout);
AnysTable::writeb(fout);
if (!locks.empty()) {
fwrite(fout, string("Lock"));
fwrite(fout, locks);
Expand All @@ -365,25 +365,24 @@ void CharaCard::readb(std::ifstream& fin) {
setName(fread<string>(fin));
break;
case 2:
Attr["__Type"] = fread<string>(fin);
dict["__Type"] = fread<string>(fin);
break;
case 3:
AttrObject::readb(fin);
AnysTable::readb(fin);
break;
case 11: {
std::unordered_map<string, short>TempAttr;
fread(fin, TempAttr);
TempAttr.erase("");
for (auto& [key, val] : TempAttr) {
AttrObject::set(key, val);
AnysTable::set(key, val);
}
}
break;
case 21: {
std::unordered_map<string, string>TempExp;
fread(fin, TempExp);
for (auto& [key, val] : TempExp) {
AttrObject::set("&" + key, val);
AnysTable::set("&" + key, val);
}
}
break;
Expand All @@ -394,12 +393,12 @@ void CharaCard::readb(std::ifstream& fin) {
std::unordered_map<string, string>TempInfo;
fread(fin, TempInfo);
for (auto& [key, val] : TempInfo) {
AttrObject::set(key, val);
AnysTable::set(key, val);
}
}
break;
case 101:
Attr["note"] = fread<string>(fin);
dict["note"] = fread<string>(fin);
break;
default:
break;
Expand Down Expand Up @@ -430,7 +429,7 @@ void CharaCard::cntRcStat(int die, int rate) {
if (die <= 5)inc("__StatRcCnt5"); //统计出1-5
if (die >= 96)inc("__StatRcCnt96"); //统计出96-100
if (die == 100)inc("__StatRcCnt100"); //统计出100
Attr["__StatRcSumRate"] = get_int("__StatRcSumRate") + rate; //总成功率
dict["__StatRcSumRate"] = get_int("__StatRcSumRate") + rate; //总成功率
update();
}
unordered_map<long long, Player> PList;
Expand Down Expand Up @@ -620,12 +619,12 @@ void Player::readb(std::ifstream& fin)
fread<unsigned long long, unsigned short>(fin, mGroupIndex);
}

AttrVar idx_pc(AttrObject& eve){
if (eve.has("pc"))return eve["pc"];
if (!eve.has("uid"))return {};
long long uid{ eve.get_ll("uid") };
long long gid{ eve.get_ll("gid") };
AttrVar idx_pc(const AttrObject& eve){
if (eve->has("pc"))return eve->at("pc");
if (!eve->has("uid"))return {};
long long uid{ eve->get_ll("uid") };
long long gid{ eve->get_ll("gid") };
if (PList.count(uid) && PList[uid][gid]->getName() != "角色卡")
return eve["pc"] = PList[uid][gid]->getName();
return eve->at("pc") = PList[uid][gid]->getName();
return idx_nick(eve);
}
31 changes: 15 additions & 16 deletions Dice/CharacterCard.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class AttrShape {
vector<string> alias;
TextType textType{ TextType::Plain };
AttrVar defVal;
AttrVar init(const CharaCard*);
AttrVar init(CharaCard*);
int check(AttrVar& val);
bool equalDefault(const AttrVar& val)const { return TextType::Plain == textType && val == defVal; }
};
Expand Down Expand Up @@ -129,7 +129,7 @@ int loadCardTemp(const std::filesystem::path& fpPath, dict_ci<CardTemp>& m);
extern unordered_map<int, string> PlayerErrors;

struct lua_State;
class CharaCard: public AttrObject
class CharaCard: public AnysTable
{
private:
string Name = "角色卡";
Expand All @@ -154,19 +154,18 @@ class CharaCard: public AttrObject
void setName(const string&);
void setType(const string&);
void update();
#define Attr (*dict)
CharaCard(){
(*dict)["__Type"] = "COC7";
(*dict)["__Update"] = (long long)time(nullptr);
dict["__Type"] = "COC7";
dict["__Update"] = (long long)time(nullptr);
}
CharaCard(const CharaCard& pc){
Name = pc.Name;
dict = std::make_shared<AttrVars>(*pc.dict);
dict = pc.dict;
}

CharaCard(const string& name, const string& type = "COC7") : Name(name)
{
(*dict)["__Name"] = name;
dict["__Name"] = name;
setType(type);
}

Expand Down Expand Up @@ -199,15 +198,15 @@ class CharaCard: public AttrObject
bool countExp(const string& key)const;

//计算表达式
std::optional<int> cal(string exp)const;
std::optional<int> cal(string exp);

void build(const string& para)
{
if (const auto it = getTemplet()->presets.find(para);
it != getTemplet()->presets.end()) {
auto& preset = it->second;
for (auto& [attr, shape] : preset.shapes) {
if (!dict->count(attr) || dict->at(attr).is_null())set(attr, shape.init(this));
if (!dict.count(attr) || dict.at(attr).is_null())set(attr, shape.init(this));
}
}
}
Expand All @@ -221,17 +220,17 @@ class CharaCard: public AttrObject
return key;
}

AttrVar get(const string& key)const;
AttrVar get(const string& key);

int set(string key, const AttrVar& val);

bool erase(string& key);
void clear();

std::optional<string> show(string key) const;
string print(const string& key)const;
std::optional<string> show(string key);
string print(const string& key);

[[nodiscard]] string show(bool isWhole) const;
[[nodiscard]] string show(bool isWhole);

bool has(const string& key)const;
//can get attr by card or temp
Expand All @@ -247,8 +246,8 @@ class CharaCard: public AttrObject
void cntRcStat(int die, int rate);

void operator<<(const CharaCard& card){
dict = std::make_shared<AttrVars>(*card.dict);
AttrObject::set("__Name", Name);
dict = card.dict;
dict["__Name"] = Name;
}

void writeb(std::ofstream& fout) const;
Expand Down Expand Up @@ -362,4 +361,4 @@ extern unordered_map<long long, Player> PList;

Player& getPlayer(long long qq);

AttrVar idx_pc(AttrObject&);
AttrVar idx_pc(const AttrObject&);
Loading

0 comments on commit a3aa41f

Please sign in to comment.