Add search functionality
This commit is contained in:
@ -90,17 +90,4 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- /#page-content-wrapper -->
|
<!-- /#page-content-wrapper -->
|
||||||
|
|
||||||
<!-- Bootstrap core JavaScript -->
|
|
||||||
<script src="vendor/jquery/jquery.min.js"></script>
|
|
||||||
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
|
|
||||||
|
|
||||||
<!-- Menu Toggle Script -->
|
|
||||||
<script>
|
|
||||||
$("#menu-toggle").click(function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
$("#wrapper").toggleClass("toggled");
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@ -41,22 +41,12 @@ namespace NightmareCoreWeb2.Pages
|
|||||||
|
|
||||||
MySqlCommand cmd = new MySqlCommand(sql, conn);
|
MySqlCommand cmd = new MySqlCommand(sql, conn);
|
||||||
MySqlDataReader rdr = cmd.ExecuteReader();
|
MySqlDataReader rdr = cmd.ExecuteReader();
|
||||||
|
AppendReaderToOnlineChars(rdr);
|
||||||
CharacterListType = "Online Players";
|
CharacterListType = "Online Players";
|
||||||
while (rdr.Read())
|
|
||||||
{
|
|
||||||
Character c = new Character();
|
|
||||||
c.Username = rdr.GetString(0);
|
|
||||||
c.Name = rdr.GetString(1);
|
|
||||||
c.Level = rdr.GetByte(2);
|
|
||||||
c.Race = rdr.GetByte(3);
|
|
||||||
c.Class = rdr.GetByte(4);
|
|
||||||
OnlineCharacters.Add(c);
|
|
||||||
}
|
|
||||||
rdr.Close();
|
|
||||||
sql = "SELECT name,flag FROM realmlist";
|
sql = "SELECT name,flag FROM realmlist";
|
||||||
cmd = new MySqlCommand(sql, conn);
|
cmd = new MySqlCommand(sql, conn);
|
||||||
rdr = cmd.ExecuteReader();
|
rdr = cmd.ExecuteReader();
|
||||||
|
|
||||||
while (rdr.Read())
|
while (rdr.Read())
|
||||||
{
|
{
|
||||||
Realms.Add(rdr.GetString(0), rdr.GetString(1).Equals("2") ? "❌" : "✔️");
|
Realms.Add(rdr.GetString(0), rdr.GetString(1).Equals("2") ? "❌" : "✔️");
|
||||||
@ -74,15 +64,68 @@ namespace NightmareCoreWeb2.Pages
|
|||||||
{
|
{
|
||||||
ViewData["Title"] = "WotDN";
|
ViewData["Title"] = "WotDN";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnGetSearch(string query)
|
||||||
|
{
|
||||||
|
if (query.Equals("all", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
OnGetAccount("all");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ViewData["Title"] = "Search";
|
||||||
|
string base_sql = "select username,name,level,race,class from characters.characters join auth.account on characters.characters.account = auth.account.id";
|
||||||
|
string search_account_name_sql = $"{base_sql} where LOWER(auth.account.username) like @name";
|
||||||
|
string search_characters_name_sql = $"{base_sql} where LOWER(characters.characters.name) like @name";
|
||||||
|
query = $"%{query}%".ToLower();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
MySqlCommand cmd = new MySqlCommand(search_account_name_sql, conn);
|
||||||
|
cmd.Parameters.AddWithValue("name", query);
|
||||||
|
MySqlDataReader rdr = cmd.ExecuteReader();
|
||||||
|
AppendReaderToOnlineChars(rdr);
|
||||||
|
|
||||||
|
cmd = new MySqlCommand(search_characters_name_sql, conn);
|
||||||
|
cmd.Parameters.AddWithValue("name", query);
|
||||||
|
rdr = cmd.ExecuteReader();
|
||||||
|
AppendReaderToOnlineChars(rdr);
|
||||||
|
|
||||||
|
CharacterListType = "Search Results";
|
||||||
|
|
||||||
|
|
||||||
|
conn.Close();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AppendReaderToOnlineChars(MySqlDataReader rdr)
|
||||||
|
{
|
||||||
|
while (rdr.Read())
|
||||||
|
{
|
||||||
|
Character c = new Character();
|
||||||
|
c.Username = rdr.GetString(0);
|
||||||
|
c.Name = rdr.GetString(1);
|
||||||
|
c.Level = rdr.GetByte(2);
|
||||||
|
c.Race = rdr.GetByte(3);
|
||||||
|
c.Class = rdr.GetByte(4);
|
||||||
|
OnlineCharacters.Add(c);
|
||||||
|
}
|
||||||
|
rdr.Close();
|
||||||
|
}
|
||||||
public void OnGetAccount(string name)
|
public void OnGetAccount(string name)
|
||||||
{
|
{
|
||||||
if (name.Equals("all", StringComparison.OrdinalIgnoreCase))
|
if (name.Equals("all", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
|
|
||||||
ViewData["Title"] = "All Characters";
|
ViewData["Title"] = "All Characters";
|
||||||
this.CharacterListType = "All Characters";
|
|
||||||
string sql = "select username,name,level,race,class from characters.characters join auth.account on characters.characters.account = auth.account.id";
|
string sql = "select username,name,level,race,class from characters.characters join auth.account on characters.characters.account = auth.account.id";
|
||||||
QuerySQL(sql);
|
QuerySQL(sql);
|
||||||
|
this.CharacterListType = "All Characters";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Account a = new Account(name);
|
Account a = new Account(name);
|
||||||
@ -112,27 +155,51 @@ namespace NightmareCoreWeb2.Pages
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
conn.Close();
|
conn.Close();
|
||||||
|
|
||||||
|
byte[] salt = new byte[32];
|
||||||
|
byte[] verifier = new byte[32];
|
||||||
|
(salt, verifier) = Framework.Cryptography.SRP6.MakeRegistrationData(Username, ActivatePassword);
|
||||||
if (valid)
|
if (valid)
|
||||||
{
|
{
|
||||||
conn.Open();
|
conn.Open();
|
||||||
byte[] salt = new byte[32];
|
|
||||||
byte[] verifier = new byte[32];
|
|
||||||
(salt, verifier) = Framework.Cryptography.SRP6.MakeRegistrationData(Username, ActivatePassword);
|
|
||||||
sql = "INSERT INTO auth.account (username,salt,verifier,email) VALUES (@username,@salt,@verifier,@email)";
|
sql = "INSERT INTO auth.account (username,salt,verifier,email) VALUES (@username,@salt,@verifier,@email)";
|
||||||
cmd = new MySqlCommand(sql, conn);
|
cmd = new MySqlCommand(sql, conn);
|
||||||
cmd.Parameters.AddWithValue("email", ActivateEmail);
|
cmd.Parameters.AddWithValue("email", ActivateEmail);
|
||||||
cmd.Parameters.AddWithValue("username", Username);
|
cmd.Parameters.AddWithValue("username", Username);
|
||||||
cmd.Parameters.AddWithValue("salt", salt);
|
cmd.Parameters.AddWithValue("salt", salt);
|
||||||
cmd.Parameters.AddWithValue("verifier", verifier);
|
cmd.Parameters.AddWithValue("verifier", verifier);
|
||||||
cmd.ExecuteNonQuery();
|
int status = cmd.ExecuteNonQuery();
|
||||||
conn.Close();
|
conn.Close();
|
||||||
|
if (status == 1)
|
||||||
|
{
|
||||||
|
Response.Redirect("/Account");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
sql = "UPDATE auth.account SET salt=@salt, verifier=@verifier WHERE username=@username";
|
||||||
|
cmd = new MySqlCommand(sql, conn);
|
||||||
|
cmd.Parameters.AddWithValue("email", ActivateEmail);
|
||||||
|
cmd.Parameters.AddWithValue("username", Username);
|
||||||
|
cmd.Parameters.AddWithValue("salt", salt);
|
||||||
|
cmd.Parameters.AddWithValue("verifier", verifier);
|
||||||
|
status = cmd.ExecuteNonQuery();
|
||||||
|
conn.Close();
|
||||||
|
if (status == 1)
|
||||||
|
{
|
||||||
|
Response.Redirect("/Account");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public void OnPostRequestToken()
|
public void OnPostRequestToken()
|
||||||
{
|
{
|
||||||
|
string sql = "INSERT INTO tokens.active_tokens (email,token) VALUES (@email,@token)";
|
||||||
|
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
var stringChars = new char[13];
|
||||||
|
var random = new Random();
|
||||||
RequestTokenEmail = Request.Form["RequestTokenEmail"];
|
RequestTokenEmail = Request.Form["RequestTokenEmail"];
|
||||||
|
|
||||||
string Username = RequestTokenEmail.Substring(0, RequestTokenEmail.IndexOf("@"));
|
string Username = RequestTokenEmail.Substring(0, RequestTokenEmail.IndexOf("@"));
|
||||||
string UserDomain = RequestTokenEmail.Substring(RequestTokenEmail.IndexOf("@"));
|
string UserDomain = RequestTokenEmail.Substring(RequestTokenEmail.IndexOf("@"));
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
@ -152,16 +219,17 @@ namespace NightmareCoreWeb2.Pages
|
|||||||
{
|
{
|
||||||
Account a = new Account(Username);
|
Account a = new Account(Username);
|
||||||
Console.WriteLine($"Account already exists {Username}");
|
Console.WriteLine($"Account already exists {Username}");
|
||||||
|
if (a.Email.Equals(RequestTokenEmail))
|
||||||
|
{
|
||||||
|
sql = "UPDATE tokens.active_tokens set token=@token where email=@email";
|
||||||
|
throw new Exception("Resetting password.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
conn.Open();
|
conn.Open();
|
||||||
string sql = "INSERT INTO tokens.active_tokens (email,token) VALUES (@email,@token)";
|
|
||||||
MySqlCommand cmd = new MySqlCommand(sql, conn);
|
MySqlCommand cmd = new MySqlCommand(sql, conn);
|
||||||
cmd.Parameters.AddWithValue("email", RequestTokenEmail);
|
cmd.Parameters.AddWithValue("email", RequestTokenEmail);
|
||||||
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
||||||
var stringChars = new char[13];
|
|
||||||
var random = new Random();
|
|
||||||
|
|
||||||
for (int i = 0; i < stringChars.Length; i++)
|
for (int i = 0; i < stringChars.Length; i++)
|
||||||
{
|
{
|
||||||
@ -217,9 +285,12 @@ namespace NightmareCoreWeb2.Pages
|
|||||||
foreach (Character c in OnlineCharacters)
|
foreach (Character c in OnlineCharacters)
|
||||||
{
|
{
|
||||||
Account a = new Account(c.Username);
|
Account a = new Account(c.Username);
|
||||||
if (a.IsGM) {
|
if (a.IsGM)
|
||||||
|
{
|
||||||
ret += $"<p>[GM] <a href=\"https://wotdn.nightmare.haus/?handler=Account&name={c.Username}\">{c.Username}</a>: {c.GetRace()} {c.GetClass()}, {c.Name}</p>";
|
ret += $"<p>[GM] <a href=\"https://wotdn.nightmare.haus/?handler=Account&name={c.Username}\">{c.Username}</a>: {c.GetRace()} {c.GetClass()}, {c.Name}</p>";
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ret += $"<p> <a href=\"https://wotdn.nightmare.haus/?handler=Account&name={c.Username}\">{c.Username}</a>: Level {c.Level} {c.GetRace()} {c.GetClass()}, {c.Name}</p>";
|
ret += $"<p> <a href=\"https://wotdn.nightmare.haus/?handler=Account&name={c.Username}\">{c.Username}</a>: Level {c.Level} {c.GetRace()} {c.GetClass()}, {c.Name}</p>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,37 +1,61 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>@ViewData["Title"] - NightmareCoreWeb2</title>
|
<title>@ViewData["Title"] - NightmareCoreWeb2</title>
|
||||||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
|
||||||
|
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
||||||
<link rel="stylesheet" href="~/css/site.css" />
|
<link rel="stylesheet" href="~/css/site.css" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
<nav
|
||||||
<div class="container">
|
class="navbar navbar-default navbar-expand-sm navbar-fixed-top sticky navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse"
|
||||||
|
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<a class="navbar-brand" asp-area="" asp-page="/Index">Wrath of the DogNet</a>
|
<a class="navbar-brand" asp-area="" asp-page="/Index">Wrath of the DogNet</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
|
||||||
aria-expanded="false" aria-label="Toggle navigation">
|
<div class="navbar-collapse collapse">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<div class="navbar navbar-nav navbar-left flex-grow-1">
|
||||||
</button>
|
|
||||||
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
|
</div>
|
||||||
<ul class="navbar-nav flex-grow-1">
|
<ul class="navbar navbar-nav navbar-right" style="padding: 10px 40px;">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
|
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link text-dark" asp-area="" asp-page="/Account">Account</a>
|
<a class="nav-link text-dark" asp-area="" asp-page="/Account">Account</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
</br>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="row height d-flex">
|
||||||
|
<div class="search">
|
||||||
|
<i class="fa fa-search"></i>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" id="search-input" class="form-control" placeholder="Username, Character">
|
||||||
|
<button class="btn btn-primary" id="search-button">Search</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main role="main" class="d-flex">
|
<main role="main" class="d-flex">
|
||||||
@RenderBody()
|
@RenderBody()
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer class="border-top footer text-muted">
|
<footer class="border-top footer text-muted">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@ -39,10 +63,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
|
||||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ=="
|
||||||
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"
|
||||||
|
integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||||
|
|
||||||
@await RenderSectionAsync("Scripts", required: false)
|
@await RenderSectionAsync("Scripts", required: false)
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -2,3 +2,16 @@
|
|||||||
// for details on configuring this project to bundle and minify static web assets.
|
// for details on configuring this project to bundle and minify static web assets.
|
||||||
|
|
||||||
// Write your JavaScript code.
|
// Write your JavaScript code.
|
||||||
|
|
||||||
|
const searchButton = document.getElementById('search-button');
|
||||||
|
const searchInput = document.getElementById('search-input');
|
||||||
|
searchButton.addEventListener('click', () => {
|
||||||
|
const inputValue = searchInput.value;
|
||||||
|
window.location.href = "/?handler=search&query=" + inputValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Menu Toggle Script
|
||||||
|
$("#menu-toggle").click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
$("#wrapper").toggleClass("toggled");
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user