public static async Task RegisterAsync(Context con, GuildModel server, IUser user, string name)
        {
            if (name.Length > 20)
            {
                throw new Exception("Name must be equal to or less than 20 characters long");
            }

            var newUser = new GuildModel.User
            {
                UserID   = user.Id,
                Username = name,
                Stats    = new GuildModel.User.Score
                {
                    Points = server.Settings.Registration.RegistrationBonus
                }
            };

            string userSelfUpdate = null;

            var eloUser = server.Users.FirstOrDefault(x => x.UserID == user.Id);

            if (eloUser != null)
            {
                if (!server.Settings.Registration.AllowMultiRegistration)
                {
                    throw new Exception("You are not allowed to re-register");
                }

                userSelfUpdate = $"{eloUser.Username} => {name}";
                newUser.Stats  = eloUser.Stats;
                newUser.Banned = eloUser.Banned;
                server.Users.Remove(eloUser);
            }
            else
            {
                if (server.Users.Count > 20 && (server.Settings.Premium.Expiry < DateTime.UtcNow || !server.Settings.Premium.IsPremium))
                {
                    throw new Exception($"Premium is required to register more than 20 users. {ConfigModel.Load().PurchaseLink}\n"
                                        + $"Get the server owner to purchase a key and use the command `{con.Prefix}Premium <key>`");
                }
            }

            server.Users.Add(newUser);

            await RegisterUpdatesAsync(con, server, newUser, user);

            server.Save();

            if (userSelfUpdate == null)
            {
                await con.Channel.SendMessageAsync("", false, new EmbedBuilder { Title = $"Success, Registered as {name}", Description = server.Settings.Registration.Message }.Build());
            }
            else
            {
                await con.Channel.SendMessageAsync("", false, new EmbedBuilder
                {
                    Description = "You have re-registered.\n" +
                                  $"Name: {userSelfUpdate}\n" +
                                  "Role's have been updated\n" +
                                  "Stats have been saved."
                }.Build());
            }

            if (con.Guild.GetRole(server.Ranks.FirstOrDefault(x => x.IsDefault)?.RoleID ?? 0) is IRole RegRole)
            {
                try
                {
                    await(user as IGuildUser).AddRoleAsync(RegRole);
                }
                catch (Exception e)
                {
                    LogHandler.LogMessage(e.ToString(), LogSeverity.Error);
                }
            }
        }