⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 users.cs

📁 YetAnotherForum.Net+ScrewTurnWiki中文完美汉化增强版
💻 CS
字号:

using System;
using System.Collections.Generic;
using System.Text;
using ScrewTurn.Wiki.PluginFramework;
using System.Web;

namespace ScrewTurn.Wiki {

	public class Users {

		private static int onlineUsers = 0;

		/// <summary>
		/// Gets or sets the Online Users.
		/// </summary>
		public static int OnlineUsers {
			get { return onlineUsers; }
			set { onlineUsers = value; }
		}

		private static Users instance = null;

		/// <summary>
		/// Gets or sets the singleton instance of the <b>Users</b> object.
		/// </summary>
		public static Users Instance {
			get { return instance; }
			set { instance = value; }
		}

		private List<UserInfo> users = null;

		/// <summary>
		/// Initializes a new instance of the <b>Users</b> class, loading users from all the available Providers.
		/// </summary>
		public Users() {
			users = new List<UserInfo>();
			Load();
		}

		/// <summary>
		/// Gets all the Users.
		/// </summary>
		public List<UserInfo> AllUsers {
			get { return users; }
		}

		/// <summary>
		/// Gets all the Administrator accounts.
		/// </summary>
		public List<UserInfo> Administrators {
			get {
				List<UserInfo> result = new List<UserInfo>();
				for(int i = 0; i < users.Count; i++) {
					if(users[i].Admin) result.Add(users[i]);
				}
				return result;
			}
		}

			/// <summary>
			/// Gets the last registered User.
			/// </summary>
			public UserInfo LatestUser {
			get {
				lock(users) {
					if(users.Count == 0) return null;

					DateTime latest = users[0].DateTime;
					int idx = 0;
					for(int i = 1; i < users.Count; i++) {
						if(users[i].DateTime.CompareTo(latest) < 0) {
							latest = users[i].DateTime;
							idx = i;
						}
					}
					return users[idx];
				}
			}
		}

		/// <summary>
		/// Loads all Users from all the providers.
		/// </summary>
		public void Load() {
			lock(users) {
				IUsersStorageProvider[] provs = Collectors.UsersProviderCollector.AllProviders;
				for(int i = 0; i < provs.Length; i++) {
					LoadFrom(provs[i], false);
				}
				users.Sort(new UsernameComparer()); // Very important for binary search
			}
		}

		public void Reload() {
			lock(users) {
				users.Clear();
			}
			Load();
		}

		/// <summary>
		/// Loads Users from the specified provider.
		/// </summary>
		/// <param name="provider">The Provider to load the Users from.</param>
		/// <param name="autosort">If true, the global users list is sorted after the operation.</param>
		public void LoadFrom(IUsersStorageProvider provider, bool autosort) {
			lock(users) {
				users.AddRange(provider.AllUsers);
				if(autosort) users.Sort(new UsernameComparer());
			}
		}

		/// <summary>
		/// Unloads all the data provided by the specified Provider.
		/// </summary>
		/// <param name="provider">The Provider.</param>
		public void UnloadFrom(IUsersStorageProvider provider) {
			lock(users) {
				List<UserInfo> toRemove = new List<UserInfo>();
				for(int i = 0; i < users.Count; i++) {
					if(users[i].Provider == provider) toRemove.Add(users[i]);
				}
				for(int i = 0; i < toRemove.Count; i++) {
					users.Remove(toRemove[i]);
				}
			}
		}

		/// <summary>
		/// Reloads all the Users managed by the specified provider.
		/// </summary>
		/// <param name="provider">The Provider.</param>
		public void ReloadFrom(IUsersStorageProvider provider) {
			lock(users) {
				List<UserInfo> toRemove = new List<UserInfo>();
				for(int i = 0; i < users.Count; i++) {
					if(users[i].Provider == provider) toRemove.Add(users[i]);
				}
				for(int i = 0; i < toRemove.Count; i++) {
					users.Remove(toRemove[i]);
				}
				LoadFrom(provider, true);
			}
		}

		/// <summary>
		/// Finds a User.
		/// </summary>
		/// <param name="username">The Username.</param>
		/// <returns>The UserInfo object or null.</returns>
		public UserInfo Find(string username) {
			int idx = users.BinarySearch(new UserInfo(username, "", true, DateTime.Now, false, null), new UsernameComparer());
			if(idx >= 0) return users[idx];
			else return null;
		}

		/// <summary>
		/// Adds a new User.
		/// </summary>
		/// <param name="username">The Username.</param>
		/// <param name="password">The Password (plain text).</param>
		/// <param name="email">The Email address.</param>
		/// <param name="active">A value specifying whether or not the account is active.</param>
		/// <param name="admin">A value specifying whether or not the user is an administrator.</param>
		/// <param name="provider">The Provider. If null, the default provider is used.</param>
		/// <returns>True if the User has been created successfully.</returns>
		public bool AddUser(string username, string password, string email, bool active, bool admin, IUsersStorageProvider provider) {
			if(Find(username) != null) return false;
			if(provider == null) provider = Collectors.UsersProviderCollector.GetProvider(Settings.DefaultUsersProvider);

			UserInfo u = provider.AddUser(username, password, email, active, DateTime.Now, admin);
			if(u == null) {
				Log.LogEntry("User creation failed for " + username, EntryType.Error, "SYSTEM");
				return false;
			}
			else {
				lock(users) {
					users.Add(u);
					users.Sort(new UsernameComparer()); // Very important
				}
				Log.LogEntry("User " + username + " created", EntryType.General, "SYSTEM");
				return true;
			}
		}

		/// <summary>
		/// Removes a User.
		/// </summary>
		/// <param name="user">The User to remove.</param>
		/// <returns>True if the User has been removed successfully.</returns>
		public bool RemoveUser(UserInfo user) {
			bool done = user.Provider.RemoveUser(user);
			if(done) {
				lock(users) {
					users.Remove(user);
					// Sorting is not needed when removing an item
				}
				Log.LogEntry("User " + user.Username + " removed", EntryType.General, "SYSTEM");
				return true;
			}
			else {
				Log.LogEntry("User deletion failed for " + user.Username, EntryType.Error, "SYSTEM");
				return false;
			}
		}

		/// <summary>
		/// Changes the Password of a User.
		/// </summary>
		/// <param name="user">The User to change the password of.</param>
		/// <param name="newPassword">The new Password (plain text).</param>
		/// <returns>True if the Password has been changed successfully.</returns>
		public bool ChangePassword(UserInfo user, string newPassword) {
			UserInfo newUser = user.Provider.ChangePassword(user, newPassword);
			if(newUser != null) {
				lock(users) {
					users.Remove(user);
					users.Add(newUser);
					users.Sort(new UsernameComparer());
				}
				Log.LogEntry("Password changed for " + user.Username, EntryType.General, "SYSTEM");
			}
			else Log.LogEntry("Password change failed for " + user.Username, EntryType.Error, "SYSTEM");
			return newUser != null;
		}

		/// <summary>
		/// Resets the User's Password, sending an Email.
		/// </summary>
		/// <param name="user">The User.</param>
		/// <returns>True if the Password has been reset successfully.</returns>
		public bool ResetPassword(UserInfo user) {
			string password = Tools.GenerateRandomPassword();
			bool done = ChangePassword(user, password);
			if(done) {
				EmailSender.Send(user.Email, Settings.SenderEmail, Settings.WikiTitle + " - Password",
					Tools.LoadFile(Settings.PasswordResetMessageFile).Replace("##USERNAME##", user.Username).Replace("##PASSWORD##", password).Replace("##WIKITITLE##", Settings.WikiTitle).Replace("##EMAILADDRESS##", Settings.ContactEmail), false);
				return true;
			}
			else return false;
		}

		/// <summary>
		/// Changes the Email address of a User.
		/// </summary>
		/// <param name="user">The User to change the Email address of.</param>
		/// <param name="newEmail">The new Email address.</param>
		/// <returns>True if the Email address has been changed successfully.</returns>
		public bool ChangeEmail(UserInfo user, string newEmail) {
			UserInfo newUser = user.Provider.ChangeEmail(user, newEmail);
			if(newUser != null) {
				lock(users) {
					users.Remove(user);
					users.Add(newUser);
					users.Sort(new UsernameComparer());
				}
				Log.LogEntry("Email changed for " + user.Username, EntryType.General, "SYSTEM");
			}
			else Log.LogEntry("Email change failed for " + user.Username, EntryType.Error, "SYSTEM");
			return newUser != null;
		}

		/// <summary>
		/// Sets the Active/Inactive status of a User.
		/// </summary>
		/// <param name="user">The User.</param>
		/// <param name="active">The status.</param>
		/// <returns>True if the User's status has been changed successfully.</returns>
		public bool SetActivationStatus(UserInfo user, bool active) {
			UserInfo newUser = user.Provider.SetUserActivationStatus(user, active);
			if(newUser != null) {
				lock(users) {
					users.Remove(user);
					users.Add(newUser);
					users.Sort(new UsernameComparer());
				}
				Log.LogEntry("User ActivationStatus changed for " + user.Username + " (" + (active ? "Activated" : "Deactivated") + ")", EntryType.General, "SYSTEM");
			}
			else Log.LogEntry("User ActivationStatus change failed for " + user.Username + " (" + (active ? "Active" : "Inactive") + ")", EntryType.Error, "SYSTEM");
			return newUser != null;
		}

		/// <summary>
		/// Sets the User/Administrator status of a User.
		/// </summary>
		/// <param name="user">The User.</param>
		/// <param name="active">The status.</param>
		/// <returns>True if the User's status has been changed successfully.</returns>
		public bool SetAdministratorStatus(UserInfo user, bool admin) {
			UserInfo newUser = user.Provider.SetUserAdministrationStatus(user, admin);
			if(newUser != null) {
				lock(users) {
					users.Remove(user);
					users.Add(newUser);
					users.Sort(new UsernameComparer());
				}
				Log.LogEntry("User AdministrationStatus changed for " + user.Username + " (" + (admin ? "Admin" : "User") + ")", EntryType.General, "SYSTEM");
			}
			else Log.LogEntry("User AdministrationStatus changed for " + user.Username + " (" + (admin ? "Admin" : "User") + ")", EntryType.Error, "SYSTEM");
			return newUser != null;
		}

		/// <summary>
		/// Creates the correct link of a User.
		/// </summary>
		/// <param name="username">The Username.</param>
		/// <returns>The User link.</returns>
		public string UserLink(string username) {
			UserInfo u = Find(username);
			if(u == null && username.Equals("admin")) u = new UserInfo("admin", Settings.ContactEmail, true, DateTime.Now, true, null);
			if(u != null) {
				return @"<a href=""Message.aspx?Username=" + Tools.UrlEncode(u.Username) + @""">" + u.Username + "</a>";
			}
			else return username;
		}

	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -