2023-05-17 11:17:53 +00:00
|
|
|
@using System.ComponentModel.DataAnnotations
|
2023-02-02 17:50:50 +00:00
|
|
|
@using ImageBoardServerApp.Auth
|
2023-01-18 12:56:24 +00:00
|
|
|
@using ImageBoardServerApp.Data.Repository
|
2023-05-17 11:17:53 +00:00
|
|
|
@using ImageBoardServerApp.Util
|
2023-01-18 12:56:24 +00:00
|
|
|
@inject NavigationManager NavigationManager
|
2023-01-27 22:50:12 +00:00
|
|
|
@inject IWebHostEnvironment env
|
2023-02-02 17:50:50 +00:00
|
|
|
@inject AuthenticationStateProvider authStateProvider
|
2023-01-18 12:56:24 +00:00
|
|
|
|
2023-06-07 12:46:39 +00:00
|
|
|
<div class="toggler">
|
2023-01-18 12:56:24 +00:00
|
|
|
<span>[</span>
|
2023-06-07 12:46:39 +00:00
|
|
|
<button onclick="@ToggleOpened">@toggleText</button>
|
2023-01-18 12:56:24 +00:00
|
|
|
<span>]</span>
|
|
|
|
</div>
|
|
|
|
@if (opened)
|
|
|
|
{
|
|
|
|
<div class="pd centered">
|
|
|
|
<span>Post to /@board.Tag/ - @board.Topic</span>
|
2023-01-27 21:09:16 +00:00
|
|
|
<div class="centered formContent">
|
|
|
|
<div>
|
2023-06-12 16:51:25 +00:00
|
|
|
<div class="pd centered marg">
|
2023-02-02 17:50:50 +00:00
|
|
|
<RadzenTextBox Placeholder="Username (Anonymous)" MaxLength="15" @bind-Value="@postUsername" Class="w-100"/>
|
2023-01-27 21:09:16 +00:00
|
|
|
</div>
|
2023-06-12 16:51:25 +00:00
|
|
|
|
|
|
|
<div class="pd centered marg">
|
2023-03-10 23:56:51 +00:00
|
|
|
<RadzenTextBox Placeholder="Title" MaxLength="128" @bind-Value="@postTitle" Class="w-100"/>
|
2023-01-27 21:09:16 +00:00
|
|
|
</div>
|
2023-06-12 16:51:25 +00:00
|
|
|
|
|
|
|
<div class="pd centered marg">
|
2023-02-02 17:50:50 +00:00
|
|
|
<RadzenTextArea Placeholder="Content..." @bind-Value="@postContent" Cols="30" Rows="6" Class="w-100"/>
|
2023-01-27 21:09:16 +00:00
|
|
|
</div>
|
2023-06-13 06:51:53 +00:00
|
|
|
<AuthorizeView Roles="Admin,Mod">
|
|
|
|
<Authorized>
|
|
|
|
<RadzenCheckBox @bind-Value=@postAnon Name="postAsAnon"/>
|
|
|
|
<RadzenLabel Text="Do not show role." Component="postAsAnon"/>
|
|
|
|
</Authorized>
|
|
|
|
</AuthorizeView>
|
2023-01-27 21:09:16 +00:00
|
|
|
</div>
|
2023-01-18 12:56:24 +00:00
|
|
|
</div>
|
2023-02-02 21:27:31 +00:00
|
|
|
@if (hasErr)
|
2023-05-31 12:13:18 +00:00
|
|
|
{
|
|
|
|
<span class="postError">@postErr</span>
|
|
|
|
}
|
2023-02-02 21:27:31 +00:00
|
|
|
<div class="pd centered marg">
|
|
|
|
<FormInfo/>
|
|
|
|
<InputFile OnChange="@SingleUpload" type="file" accept="image/*"/>
|
2023-01-18 12:56:24 +00:00
|
|
|
<RadzenButton class="pd" Click="@onPostClick" Text="Post!"></RadzenButton>
|
|
|
|
</div>
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
</div>
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@code {
|
|
|
|
|
|
|
|
private bool opened = false;
|
|
|
|
|
|
|
|
private string toggleText = "Open Post Formula";
|
|
|
|
|
|
|
|
private void ToggleOpened()
|
|
|
|
{
|
|
|
|
opened = !opened;
|
|
|
|
toggleText = opened ? "Close Post Formula" : "Open Post Formula";
|
|
|
|
}
|
|
|
|
|
|
|
|
[Parameter]
|
|
|
|
[Required]
|
|
|
|
public BoardData board { get; set; } = new BoardData();
|
|
|
|
|
2023-05-31 12:50:05 +00:00
|
|
|
string postUsername { get; set; }
|
2023-02-02 17:50:50 +00:00
|
|
|
string postTitle { get; set; } = "";
|
|
|
|
string postContent { get; set; } = "";
|
2023-06-13 06:51:53 +00:00
|
|
|
bool postAnon { get; set; } = false;
|
2023-02-02 17:50:50 +00:00
|
|
|
|
2023-06-12 16:51:25 +00:00
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
2023-05-31 12:50:05 +00:00
|
|
|
{
|
|
|
|
var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
|
|
|
|
var user = await cauthStateProvder.GetAuthenticationStateAsync();
|
|
|
|
var usr = user.User;
|
2023-06-12 18:46:44 +00:00
|
|
|
UserData foundusr = await UsersRepository.getUserByEmailRawAsync(usr.Identity.Name);
|
2023-05-31 12:50:05 +00:00
|
|
|
if (foundusr == null)
|
|
|
|
{
|
|
|
|
hasErr = true;
|
|
|
|
postErr = "You are not logged in.";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
postUsername = foundusr.LastUsedName;
|
2023-06-13 14:24:38 +00:00
|
|
|
if (!foundusr.ConfirmedEmail)
|
|
|
|
{
|
|
|
|
hasErr = true;
|
|
|
|
postErr = "You cannot post without an verified email.";
|
|
|
|
return;
|
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
await base.OnAfterRenderAsync(firstRender);
|
2023-05-31 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2023-01-27 22:50:12 +00:00
|
|
|
private IBrowserFile selectedFile;
|
2023-06-12 16:51:25 +00:00
|
|
|
|
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
private async Task SingleUpload(InputFileChangeEventArgs e)
|
|
|
|
{
|
2023-01-27 22:50:12 +00:00
|
|
|
selectedFile = e.GetMultipleFiles()[0];
|
|
|
|
this.StateHasChanged();
|
2023-01-18 12:56:24 +00:00
|
|
|
}
|
|
|
|
|
2023-02-02 21:13:03 +00:00
|
|
|
string postErr { get; set; }
|
|
|
|
bool hasErr { get; set; } = false;
|
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
private async Task onPostClick()
|
|
|
|
{
|
2023-02-02 17:50:50 +00:00
|
|
|
var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
|
|
|
|
var user = await cauthStateProvder.GetAuthenticationStateAsync();
|
|
|
|
var usr = user.User;
|
2023-06-12 18:46:44 +00:00
|
|
|
UserData foundusr = await UsersRepository.getUserByEmailRawAsync(usr.Identity.Name);
|
2023-02-02 21:13:03 +00:00
|
|
|
if (foundusr == null)
|
|
|
|
{
|
|
|
|
hasErr = true;
|
|
|
|
postErr = "You are not logged in.";
|
|
|
|
return;
|
|
|
|
}
|
2023-06-13 17:08:43 +00:00
|
|
|
if (!foundusr.ConfirmedEmail)
|
|
|
|
{
|
|
|
|
hasErr = true;
|
|
|
|
postErr = "You cannot post without an verified email.";
|
|
|
|
return;
|
|
|
|
}
|
2023-02-02 17:50:50 +00:00
|
|
|
int userID = foundusr.UserID;
|
2023-02-13 20:39:39 +00:00
|
|
|
if (DateTimeOffset.Now.ToUnixTimeMilliseconds() - foundusr.TimeBanned < 0)
|
|
|
|
{
|
|
|
|
foundusr.TimeBanned = -1;
|
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-02-02 21:13:03 +00:00
|
|
|
if (foundusr.TimeBanned != -1)
|
|
|
|
{
|
2023-06-13 17:08:43 +00:00
|
|
|
var dt = TheManager.ConvertToDateTime(foundusr.TimeBanned);
|
2023-02-02 21:27:31 +00:00
|
|
|
hasErr = true;
|
2023-06-13 17:08:43 +00:00
|
|
|
postErr = "You are banned for " + foundusr.BanReason + " and may not post until " + dt.Year + "." + dt.Month + "." + dt.Day + " " + dt.Hour + ":" + dt.Minute + "::" + dt.Second;
|
2023-02-02 17:50:50 +00:00
|
|
|
return;
|
2023-02-02 21:13:03 +00:00
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-03-04 22:09:26 +00:00
|
|
|
BoardData b = await BoardsRepository.getBoardByTagAsync(board.Tag);
|
|
|
|
if (b.isLocked)
|
|
|
|
{
|
|
|
|
hasErr = true;
|
|
|
|
postErr = "This board is currently locked.";
|
|
|
|
return;
|
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-02-12 16:01:46 +00:00
|
|
|
foundusr.lastActionTimeStamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
2023-05-31 12:50:05 +00:00
|
|
|
if (postUsername == null || postUsername == "")
|
|
|
|
{
|
|
|
|
postUsername = "Anonymous";
|
|
|
|
}
|
|
|
|
foundusr.LastUsedName = postUsername;
|
2023-02-02 17:50:50 +00:00
|
|
|
await UsersRepository.updateUserAsync(foundusr);
|
2023-06-12 16:51:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
//TODO Add check if data is image
|
|
|
|
|
2023-06-13 05:47:49 +00:00
|
|
|
if (selectedFile == null || selectedFile.Size >= 512000 * 2 * 10)
|
2023-01-27 22:50:12 +00:00
|
|
|
{
|
2023-02-02 21:27:31 +00:00
|
|
|
hasErr = true;
|
2023-06-13 05:47:49 +00:00
|
|
|
postErr = "You did not attach a file or the selected file is bigger then the 10MiB file limit.";
|
2023-01-27 22:50:12 +00:00
|
|
|
return;
|
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-06-13 05:47:49 +00:00
|
|
|
Stream stream = selectedFile.OpenReadStream(maxAllowedSize: 512000 * 2 * 10); // max 10MB
|
2023-02-01 13:18:36 +00:00
|
|
|
var file = Path.GetRandomFileName() + "." + selectedFile.Name.Split(".")[selectedFile.Name.Split(".").Length - 1];
|
2023-02-07 20:47:28 +00:00
|
|
|
var path = $"{env.WebRootPath}/img/dynamic/op/{@board.Tag}/{@file}";
|
2023-01-27 22:50:12 +00:00
|
|
|
FileStream fs = File.Create(path);
|
|
|
|
await stream.CopyToAsync(fs);
|
|
|
|
stream.Close();
|
|
|
|
fs.Close();
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
var imageToUpload = new ImageData
|
|
|
|
{
|
|
|
|
Board = board.Tag,
|
2023-02-07 20:47:28 +00:00
|
|
|
ImageLocation = $"/img/dynamic/op/{@board.Tag}/{@file}"
|
2023-01-18 12:56:24 +00:00
|
|
|
};
|
|
|
|
int imageID = await ImagesRepository.createImageAsync(imageToUpload);
|
2023-03-11 01:50:07 +00:00
|
|
|
|
|
|
|
int thisGET = b.NumberOfGETs + 1;
|
|
|
|
b.NumberOfGETs++;
|
|
|
|
await BoardsRepository.updateBoardAsync(b);
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
var postToPost = new PostData
|
|
|
|
{
|
|
|
|
UserID = userID,
|
|
|
|
ImageID = imageID,
|
|
|
|
Username = postUsername,
|
|
|
|
Title = postTitle,
|
|
|
|
Content = postContent,
|
2023-01-25 16:26:21 +00:00
|
|
|
Interactions = 0,
|
2023-01-18 12:56:24 +00:00
|
|
|
CreatedAt = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
|
2023-02-24 23:08:36 +00:00
|
|
|
Board = board.Tag,
|
|
|
|
IsLocked = false,
|
2023-03-11 01:50:07 +00:00
|
|
|
IsSticky = false,
|
2023-06-13 06:51:53 +00:00
|
|
|
GET = thisGET,
|
|
|
|
shouldAnon = postAnon
|
2023-01-18 12:56:24 +00:00
|
|
|
};
|
|
|
|
int postId = await PostsRepository.createPostAsync(postToPost);
|
|
|
|
if (postId != -1)
|
|
|
|
{
|
2023-06-12 16:51:25 +00:00
|
|
|
//Open post successfull
|
2023-01-26 12:04:55 +00:00
|
|
|
NavigationManager.NavigateTo($"/{board.Tag}/thread/{postId}", true, true);
|
2023-02-14 11:46:52 +00:00
|
|
|
await TheManager.bumpThreads(board);
|
2023-01-18 12:56:24 +00:00
|
|
|
Console.WriteLine("Post created");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-06-12 16:51:25 +00:00
|
|
|
//Open post unsucessfull
|
2023-02-02 21:27:31 +00:00
|
|
|
hasErr = true;
|
|
|
|
postErr = "There was an error and the post could not be created. Please notify the admin.";
|
2023-01-18 12:56:24 +00:00
|
|
|
Console.WriteLine("Shit sucks and did not work.");
|
|
|
|
}
|
|
|
|
}
|
2023-06-12 16:51:25 +00:00
|
|
|
|
2023-01-18 12:56:24 +00:00
|
|
|
}
|