void DataKeeper::DoRestoreChans() { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Restoring channel data"); Modes::ChangeList modechange; for (std::vector<ChanData>::const_iterator i = chandatalist.begin(); i != chandatalist.end(); ++i) { const ChanData& chandata = *i; Channel* const chan = ServerInstance->FindChan(chandata.owner); if (!chan) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Channel %s not found", chandata.owner.c_str()); continue; } RestoreObj(chandata, chan, MODETYPE_CHANNEL, modechange); // Process the mode change before applying any prefix modes ServerInstance->Modes.Process(ServerInstance->FakeClient, chan, NULL, modechange, ModeParser::MODE_LOCALONLY); modechange.clear(); // Restore all member data RestoreMemberData(chan, chandata.memberdatalist, modechange); ServerInstance->Modes.Process(ServerInstance->FakeClient, chan, NULL, modechange, ModeParser::MODE_LOCALONLY); modechange.clear(); } }
void DataKeeper::DoRestoreUsers() { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Restoring user data"); Modes::ChangeList modechange; for (std::vector<UserData>::const_iterator i = userdatalist.begin(); i != userdatalist.end(); ++i) { const UserData& userdata = *i; User* const user = ServerInstance->FindUUID(userdata.owner); if (!user) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "User %s is gone", userdata.owner.c_str()); continue; } RestoreObj(userdata, user, MODETYPE_USER, modechange); ServerInstance->Modes.Process(ServerInstance->FakeClient, NULL, user, modechange, ModeParser::MODE_LOCALONLY); modechange.clear(); } }
void DataKeeper::RestoreMemberData(Channel* chan, const std::vector<ChanData::MemberData>& memberdatalist, Modes::ChangeList& modechange) { for (std::vector<ChanData::MemberData>::const_iterator i = memberdatalist.begin(); i != memberdatalist.end(); ++i) { const ChanData::MemberData& md = *i; User* const user = ServerInstance->FindUUID(md.owner); if (!user) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "User %s is gone (while processing %s)", md.owner.c_str(), chan->name.c_str()); continue; } Membership* const memb = chan->GetUser(user); if (!memb) { ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Member %s is no longer on channel %s", md.owner.c_str(), chan->name.c_str()); continue; } RestoreObj(md, memb, MODETYPE_CHANNEL, modechange); } }
void DataKeeper::DoRestoreUsers() { ServerInstance->Logs.Log(MODNAME, LOG_DEBUG, "Restoring user data"); Modes::ChangeList modechange; for (std::vector<UserData>::const_iterator i = userdatalist.begin(); i != userdatalist.end(); ++i) { const UserData& userdata = *i; User* const user = ServerInstance->FindUUID(userdata.owner); if (!user) { ServerInstance->Logs.Log(MODNAME, LOG_DEBUG, "User %s is gone", userdata.owner.c_str()); continue; } // Attempt to restore serializer first, if it fails it's a fatal error and RestoreSerializer() quits them if (!RestoreSerializer(userdata.serializerindex, user)) continue; RestoreObj(userdata, user, MODETYPE_USER, modechange); ServerInstance->Modes.Process(ServerInstance->FakeClient, NULL, user, modechange, ModeParser::MODE_LOCALONLY); modechange.clear(); } }