+class RemoteUser : public User
+{
+ public:
+ RemoteUser(const std::string& uid, Server* srv) : User(uid, srv, USERTYPE_REMOTE)
+ {
+ }
+};
+
+class CoreExport FakeUser : public User
+{
+ public:
+ FakeUser(const std::string& uid, Server* srv) : User(uid, srv, USERTYPE_SERVER)
+ {
+ nick = srv->GetName();
+ }
+
+ FakeUser(const std::string& uid, const std::string& sname, const std::string& sdesc)
+ : User(uid, new Server(sname, sdesc), USERTYPE_SERVER)
+ {
+ nick = sname;
+ }
+
+ virtual CullResult cull() CXX11_OVERRIDE;
+ virtual const std::string& GetFullHost() CXX11_OVERRIDE;
+ virtual const std::string& GetFullRealHost() CXX11_OVERRIDE;
+};
+
+/* Faster than dynamic_cast */
+/** Is a local user */
+inline LocalUser* IS_LOCAL(User* u)
+{
+ return u->usertype == USERTYPE_LOCAL ? static_cast<LocalUser*>(u) : NULL;
+}
+/** Is a remote user */
+inline RemoteUser* IS_REMOTE(User* u)
+{
+ return u->usertype == USERTYPE_REMOTE ? static_cast<RemoteUser*>(u) : NULL;
+}
+/** Is a server fakeuser */
+inline FakeUser* IS_SERVER(User* u)
+{
+ return u->usertype == USERTYPE_SERVER ? static_cast<FakeUser*>(u) : NULL;
+}
+
+inline bool User::IsModeSet(const ModeHandler* mh) const
+{
+ return (modes[mh->GetId()]);
+}
+
+inline bool User::IsModeSet(UserModeReference& moderef) const
+{
+ if (!moderef)
+ return false;
+ return IsModeSet(*moderef);
+}
+
+inline void User::SetMode(ModeHandler* mh, bool value)
+{
+ modes[mh->GetId()] = value;
+}