📄 favoritemanager.cpp
字号:
xml.addChildAttrib("UserDescription", j->second.getDescription());
xml.addChildAttrib("Nick", j->second.getNick());
xml.addChildAttrib("URL", j->second.getUrl());
xml.addChildAttrib("CID", j->first.toBase32());
}
xml.stepOut();
xml.addTag("UserCommands");
xml.stepIn();
for(UserCommand::Iter k = userCommands.begin(); k != userCommands.end(); ++k) {
if(!k->isSet(UserCommand::FLAG_NOSAVE)) {
xml.addTag("UserCommand");
xml.addChildAttrib("Type", k->getType());
xml.addChildAttrib("Context", k->getCtx());
xml.addChildAttrib("Name", k->getName());
xml.addChildAttrib("Command", k->getCommand());
xml.addChildAttrib("Hub", k->getHub());
}
}
xml.stepOut();
//Favorite download to dirs
xml.addTag("FavoriteDirs");
xml.stepIn();
StringPairList spl = getFavoriteDirs();
for(StringPairIter i = spl.begin(); i != spl.end(); ++i) {
xml.addTag("Directory", i->first);
xml.addChildAttrib("Name", i->second);
}
xml.stepOut();
xml.stepOut();
string fname = getConfigFile();
File f(fname + ".tmp", File::WRITE, File::CREATE | File::TRUNCATE);
f.write(SimpleXML::utf8Header);
f.write(xml.toXML());
f.close();
File::deleteFile(fname);
File::renameFile(fname + ".tmp", fname);
} catch(const Exception& e) {
dcdebug("FavoriteManager::save: %s\n", e.getError().c_str());
}
}
void FavoriteManager::load() {
// Add NMDC standard op commands
static const char kickstr[] =
"$To: %[userNI] From: %[myNI] $<%[myNI]> You are being kicked because: %[line:Reason]|<%[myNI]> %[myNI] is kicking %[userNI] because: %[line:Reason]|$Kick %[userNI]|";
addUserCommand(UserCommand::TYPE_RAW_ONCE, UserCommand::CONTEXT_CHAT | UserCommand::CONTEXT_SEARCH, UserCommand::FLAG_NOSAVE,
STRING(KICK_USER), kickstr, "op");
static const char redirstr[] =
"$OpForceMove $Who:%[userNI]$Where:%[line:Target Server]$Msg:%[line:Message]|";
addUserCommand(UserCommand::TYPE_RAW_ONCE, UserCommand::CONTEXT_CHAT | UserCommand::CONTEXT_SEARCH, UserCommand::FLAG_NOSAVE,
STRING(REDIRECT_USER), redirstr, "op");
// Add ADC standard op commands
static const char adc_disconnectstr[] =
"HDSC %[userSID]\n";
addUserCommand(UserCommand::TYPE_RAW_ONCE, UserCommand::CONTEXT_CHAT | UserCommand::CONTEXT_SEARCH, UserCommand::FLAG_NOSAVE,
STRING(DISCONNECT_USER), adc_disconnectstr, "adc://op");
try {
SimpleXML xml;
xml.fromXML(File(getConfigFile(), File::READ, File::OPEN).read());
if(xml.findChild("Favorites")) {
xml.stepIn();
load(&xml);
xml.stepOut();
}
} catch(const Exception& e) {
dcdebug("FavoriteManager::load: %s\n", e.getError().c_str());
}
}
void FavoriteManager::load(SimpleXML* aXml) {
dontSave = true;
aXml->resetCurrentChild();
if(aXml->findChild("Hubs")) {
aXml->stepIn();
while(aXml->findChild("Hub")) {
FavoriteHubEntry* e = new FavoriteHubEntry();
e->setName(aXml->getChildAttrib("Name"));
e->setConnect(aXml->getBoolChildAttrib("Connect"));
e->setDescription(aXml->getChildAttrib("Description"));
e->setNick(aXml->getChildAttrib("Nick"));
e->setPassword(aXml->getChildAttrib("Password"));
e->setServer(aXml->getChildAttrib("Server"));
e->setUserDescription(aXml->getChildAttrib("UserDescription"));
e->setBottom((u_int16_t)aXml->getIntChildAttrib("Bottom") );
e->setTop((u_int16_t)aXml->getIntChildAttrib("Top"));
e->setRight((u_int16_t)aXml->getIntChildAttrib("Right"));
e->setLeft((u_int16_t)aXml->getIntChildAttrib("Left"));
favoriteHubs.push_back(e);
}
aXml->stepOut();
}
aXml->resetCurrentChild();
if(aXml->findChild("Users")) {
aXml->stepIn();
while(aXml->findChild("User")) {
User::Ptr u;
const string& cid = aXml->getChildAttrib("CID");
const string& nick = aXml->getChildAttrib("Nick");
const string& hubUrl = aXml->getChildAttrib("URL");
if(cid.length() != 39) {
if(nick.empty() || hubUrl.empty())
continue;
u = ClientManager::getInstance()->getUser(nick, hubUrl);
} else {
u = ClientManager::getInstance()->getUser(CID(cid));
if(u->getFirstNick().empty())
u->setFirstNick(nick);
}
FavoriteMap::iterator i = users.insert(make_pair(u->getCID(), FavoriteUser(u, nick, hubUrl))).first;
if(aXml->getBoolChildAttrib("GrantSlot"))
i->second.setFlag(FavoriteUser::FLAG_GRANTSLOT);
i->second.setLastSeen((u_int32_t)aXml->getIntChildAttrib("LastSeen"));
i->second.setDescription(aXml->getChildAttrib("UserDescription"));
i->second.getUser()->setFlag(User::SAVE_NICK);
}
aXml->stepOut();
}
aXml->resetCurrentChild();
if(aXml->findChild("UserCommands")) {
aXml->stepIn();
while(aXml->findChild("UserCommand")) {
addUserCommand(aXml->getIntChildAttrib("Type"), aXml->getIntChildAttrib("Context"),
0, aXml->getChildAttrib("Name"), aXml->getChildAttrib("Command"), aXml->getChildAttrib("Hub"));
}
aXml->stepOut();
}
//Favorite download to dirs
aXml->resetCurrentChild();
if(aXml->findChild("FavoriteDirs")) {
aXml->stepIn();
while(aXml->findChild("Directory")) {
string virt = aXml->getChildAttrib("Name");
string d(aXml->getChildData());
FavoriteManager::getInstance()->addFavoriteDir(d, virt);
}
aXml->stepOut();
}
dontSave = false;
}
void FavoriteManager::userUpdated(const OnlineUser& info) {
Lock l(cs);
FavoriteMap::iterator i = users.find(info.getUser()->getCID());
if(i != users.end()) {
FavoriteUser& fu = i->second;
fu.update(info);
save();
}
}
FavoriteHubEntry* FavoriteManager::getFavoriteHubEntry(const string& aServer) {
for(FavoriteHubEntry::Iter i = favoriteHubs.begin(); i != favoriteHubs.end(); ++i) {
FavoriteHubEntry* hub = *i;
if(Util::stricmp(hub->getServer(), aServer) == 0) {
return hub;
}
}
return NULL;
}
bool FavoriteManager::hasSlot(const User::Ptr& aUser) const {
Lock l(cs);
FavoriteMap::const_iterator i = users.find(aUser->getCID());
if(i == users.end())
return false;
return i->second.isSet(FavoriteUser::FLAG_GRANTSLOT);
}
time_t FavoriteManager::getLastSeen(const User::Ptr& aUser) const {
Lock l(cs);
FavoriteMap::const_iterator i = users.find(aUser->getCID());
if(i == users.end())
return 0;
return i->second.getLastSeen();
}
void FavoriteManager::setAutoGrant(const User::Ptr& aUser, bool grant) {
Lock l(cs);
FavoriteMap::iterator i = users.find(aUser->getCID());
if(i == users.end())
return;
if(grant)
i->second.setFlag(FavoriteUser::FLAG_GRANTSLOT);
else
i->second.unsetFlag(FavoriteUser::FLAG_GRANTSLOT);
save();
}
void FavoriteManager::setUserDescription(const User::Ptr& aUser, const string& description) {
Lock l(cs);
FavoriteMap::iterator i = users.find(aUser->getCID());
if(i == users.end())
return;
i->second.setDescription(description);
save();
}
StringList FavoriteManager::getHubLists() {
StringTokenizer<string> lists(SETTING(HUBLIST_SERVERS), ';');
return lists.getTokens();
}
bool FavoriteManager::setHubList(int aHubList) {
if(!running) {
lastServer = aHubList;
StringList sl = getHubLists();
publicListServer = sl[(lastServer) % sl.size()];
return true;
}
return false;
}
void FavoriteManager::refresh() {
StringList sl = getHubLists();
if(sl.empty())
return;
publicListServer = sl[(lastServer) % sl.size()];
if(Util::strnicmp(publicListServer.c_str(), "http://", 7) != 0) {
lastServer++;
return;
}
fire(FavoriteManagerListener::DownloadStarting(), publicListServer);
if(!running) {
if(!c)
c = new HttpConnection();
{
Lock l(cs);
publicListMatrix[publicListServer].clear();
}
c->addListener(this);
c->downloadFile(publicListServer);
running = true;
}
}
UserCommand::List FavoriteManager::getUserCommands(int ctx, const StringList& hubs) {
vector<bool> isOp(hubs.size());
for(size_t i = 0; i < hubs.size(); ++i) {
if(ClientManager::getInstance()->isOp(ClientManager::getInstance()->getMe(), hubs[i])) {
isOp[i] = true;
}
}
Lock l(cs);
UserCommand::List lst;
for(UserCommand::Iter i = userCommands.begin(); i != userCommands.end(); ++i) {
UserCommand& uc = *i;
if(!(uc.getCtx() & ctx)) {
continue;
}
for(size_t j = 0; j < hubs.size(); ++j) {
const string& hub = hubs[j];
bool hubAdc = hub.compare(0, 6, "adc://") == 0;
bool commandAdc = uc.getHub().compare(0, 6, "adc://") == 0;
if(hubAdc && commandAdc) {
if((uc.getHub().length() == 6) ||
(uc.getHub() == "adc://op" && isOp[j]) ||
(uc.getHub() == hub) )
{
lst.push_back(*i);
break;
}
} else if(!hubAdc && !commandAdc) {
if((uc.getHub().length() == 0) ||
(uc.getHub() == "op" && isOp[j]) ||
(uc.getHub() == hub) )
{
lst.push_back(*i);
break;
}
}
}
}
return lst;
}
// HttpConnectionListener
void FavoriteManager::on(Data, HttpConnection*, const u_int8_t* buf, size_t len) throw() {
downloadBuf.append((const char*)buf, len);
}
void FavoriteManager::on(Failed, HttpConnection*, const string& aLine) throw() {
c->removeListener(this);
lastServer++;
running = false;
fire(FavoriteManagerListener::DownloadFailed(), aLine);
}
void FavoriteManager::on(Complete, HttpConnection*, const string& aLine) throw() {
c->removeListener(this);
onHttpFinished();
running = false;
fire(FavoriteManagerListener::DownloadFinished(), aLine);
}
void FavoriteManager::on(Redirected, HttpConnection*, const string& aLine) throw() {
fire(FavoriteManagerListener::DownloadStarting(), aLine);
}
void FavoriteManager::on(TypeNormal, HttpConnection*) throw() {
listType = TYPE_NORMAL;
}
void FavoriteManager::on(TypeBZ2, HttpConnection*) throw() {
listType = TYPE_BZIP2;
}
void FavoriteManager::on(UserUpdated, const OnlineUser& user) throw() {
userUpdated(user);
}
void FavoriteManager::on(UserDisconnected, const User::Ptr& user) throw() {
bool isFav = false;
{
Lock l(cs);
FavoriteMap::iterator i = users.find(user->getCID());
if(i != users.end()) {
isFav = true;
i->second.setLastSeen(GET_TIME());
save();
}
}
if(isFav)
fire(FavoriteManagerListener::StatusChanged(), user);
}
void FavoriteManager::on(UserConnected, const User::Ptr& user) throw() {
bool isFav = false;
{
Lock l(cs);
FavoriteMap::iterator i = users.find(user->getCID());
if(i != users.end()) {
isFav = true;
}
}
if(isFav)
fire(FavoriteManagerListener::StatusChanged(), user);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -