Tento commit je obsažen v:
sneedmaster 2024-01-20 14:35:20 +01:00
rodič ec141bc69e
revize 72fd48d11e
12 změnil soubory, kde provedl 44 přidání a 8 odebrání

Zobrazit soubor

@ -24,6 +24,7 @@ lazy_static! {
pub static ref SPOILER_REGEX: Regex = Regex::new(r"\|\|([\s\S]+?)\|\|").unwrap(); pub static ref SPOILER_REGEX: Regex = Regex::new(r"\|\|([\s\S]+?)\|\|").unwrap();
pub static ref URL_REGEX: Regex = pub static ref URL_REGEX: Regex =
Regex::new(r"https?\:&#x2F;&#x2F;[^\s<>\[\]{}|\\^]+").unwrap(); Regex::new(r"https?\:&#x2F;&#x2F;[^\s<>\[\]{}|\\^]+").unwrap();
pub static ref JANNYTEXT_REGEX: Regex = Regex::new(r"##(.+?)##").unwrap();
} }
pub fn parse_name( pub fn parse_name(
@ -106,6 +107,7 @@ fn capcode_fallback(owner: bool) -> String {
pub async fn markup( pub async fn markup(
ctx: &Ctx, ctx: &Ctx,
perms: &PermissionWrapper,
board: Option<String>, board: Option<String>,
op: Option<i64>, op: Option<i64>,
text: &str, text: &str,
@ -119,8 +121,8 @@ pub async fn markup(
let id_raw = &captures[1]; let id_raw = &captures[1];
let Ok(id) = id_raw.parse() else { let Ok(id) = id_raw.parse() else {
return format!("<span class=\"dead-quote\">&gt;&gt;{id_raw}</span>"); return format!("<span class=\"dead-quote\">&gt;&gt;{id_raw}</span>");
}; };
let post = quoted_posts.get(&id); let post = quoted_posts.get(&id);
@ -165,6 +167,12 @@ pub async fn markup(
format!("<a rel=\"nofollow\" href=\"{url}\">{url}</a>") format!("<a rel=\"nofollow\" href=\"{url}\">{url}</a>")
}); });
let text = if perms.owner() || perms.jannytext() {
JANNYTEXT_REGEX.replace_all(&text, "<span class=\"jannytext\">$1</span>")
} else {
text
};
Ok(text.to_string()) Ok(text.to_string())
} }

Zobrazit soubor

@ -14,6 +14,7 @@ pub enum Permissions {
BoardBanners, BoardBanners,
BoardConfig, BoardConfig,
News, News,
Jannytext,
BypassBans, BypassBans,
BypassBoardLock, BypassBoardLock,
BypassThreadLock, BypassThreadLock,
@ -78,6 +79,10 @@ impl PermissionWrapper {
self.0.contains(Permissions::News) self.0.contains(Permissions::News)
} }
pub fn jannytext(&self) -> bool {
self.0.contains(Permissions::Jannytext)
}
pub fn bypass_bans(&self) -> bool { pub fn bypass_bans(&self) -> bool {
self.0.contains(Permissions::BypassBans) self.0.contains(Permissions::BypassBans)
} }

Zobrazit soubor

@ -174,6 +174,7 @@ pub async fn create_post(
let content = markup( let content = markup(
&ctx, &ctx,
&perms,
Some(board.id.clone()), Some(board.id.clone()),
thread.as_ref().map(|t| t.id), thread.as_ref().map(|t| t.id),
&content_nomarkup, &content_nomarkup,

Zobrazit soubor

@ -40,6 +40,7 @@ pub async fn edit_posts(
let content_nomarkup = content_nomarkup.trim(); let content_nomarkup = content_nomarkup.trim();
let content = markup( let content = markup(
&ctx, &ctx,
&tcx.perms,
Some(post.board.clone()), Some(post.board.clone()),
post.thread, post.thread,
content_nomarkup, content_nomarkup,

Zobrazit soubor

@ -17,7 +17,7 @@ use crate::{
}; };
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct JannyPostActionsForm { pub struct StaffPostActionsForm {
#[serde(default)] #[serde(default)]
pub posts: Vec<String>, pub posts: Vec<String>,
#[serde(rename = "staff_remove_posts")] #[serde(rename = "staff_remove_posts")]
@ -40,7 +40,7 @@ pub struct JannyPostActionsForm {
pub async fn staff_post_actions( pub async fn staff_post_actions(
ctx: Data<Ctx>, ctx: Data<Ctx>,
req: HttpRequest, req: HttpRequest,
QsForm(form): QsForm<JannyPostActionsForm>, QsForm(form): QsForm<StaffPostActionsForm>,
) -> Result<HttpResponse, NekrochanError> { ) -> Result<HttpResponse, NekrochanError> {
let tcx = TemplateCtx::new(&ctx, &req).await?; let tcx = TemplateCtx::new(&ctx, &req).await?;
let account = account_from_auth(&ctx, &req).await?; let account = account_from_auth(&ctx, &req).await?;
@ -156,12 +156,12 @@ pub async fn staff_post_actions(
Ban::create(&ctx, account, board, ip_range, reason, appealable, expires).await?; Ban::create(&ctx, account, board, ip_range, reason, appealable, expires).await?;
let content_nomarkup = format!( let content_nomarkup = format!(
"{}\n\n==(UŽIVATEL BYL ZA TENTO PŘÍSPĚVEK ZABANOVÁN)==", "{}\n\n##(UŽIVATEL BYL ZA TENTO PŘÍSPĚVEK ZABANOVÁN)##",
post.content_nomarkup post.content_nomarkup
); );
let content = format!( let content = format!(
"{}\n\n<span class=\"redtext\">(UŽIVATEL BYL ZA TENTO PŘÍSPĚVEK ZABANOVÁN)</span>", "{}\n\n<span class=\"jannytext\">(UŽIVATEL BYL ZA TENTO PŘÍSPĚVEK ZABANOVÁN)</span>",
post.content post.content
); );

Zobrazit soubor

@ -36,7 +36,7 @@ pub async fn create_news(
} }
let content_nomarkup = content; let content_nomarkup = content;
let content = markup(&ctx, None, None, &content_nomarkup).await?; let content = markup(&ctx, &account.perms(), None, None, &content_nomarkup).await?;
NewsPost::create(&ctx, title, content, content_nomarkup, account.username).await?; NewsPost::create(&ctx, title, content, content_nomarkup, account.username).await?;

Zobrazit soubor

@ -52,7 +52,7 @@ pub async fn edit_news(
} }
let content_nomarkup = content_nomarkup.trim(); let content_nomarkup = content_nomarkup.trim();
let content = markup(&ctx, None, None, content_nomarkup).await?; let content = markup(&ctx, &tcx.perms, None, None, content_nomarkup).await?;
newspost newspost
.update(&ctx, content, content_nomarkup.into()) .update(&ctx, content, content_nomarkup.into())

Zobrazit soubor

@ -19,6 +19,7 @@ pub struct UpdatePermissionsForm {
bans: Option<String>, bans: Option<String>,
banners: Option<String>, banners: Option<String>,
news: Option<String>, news: Option<String>,
jannytext: Option<String>,
board_config: Option<String>, board_config: Option<String>,
bypass_bans: Option<String>, bypass_bans: Option<String>,
bypass_board_lock: Option<String>, bypass_board_lock: Option<String>,
@ -86,6 +87,10 @@ pub async fn update_permissions(
permissions |= Permissions::News; permissions |= Permissions::News;
} }
if form.jannytext.is_some() {
permissions |= Permissions::Jannytext;
}
if form.bypass_bans.is_some() { if form.bypass_bans.is_some() {
permissions |= Permissions::BypassBans; permissions |= Permissions::BypassBans;
} }

Zobrazit soubor

@ -426,6 +426,11 @@ summary {
background-color: transparent; background-color: transparent;
} }
.jannytext {
color: var(--jannytext-color);
font-weight: bold;
}
.icon { .icon {
height: 1em; height: 1em;
vertical-align: text-top; vertical-align: text-top;

Zobrazit soubor

@ -36,4 +36,5 @@
--bluetext-color: #0000ff; --bluetext-color: #0000ff;
--uh-oh-color: #ffffff; --uh-oh-color: #ffffff;
--uh-oh-text: #0038b8; --uh-oh-text: #0038b8;
--jannytext-color: #ff0000;
} }

Zobrazit soubor

@ -36,4 +36,5 @@
--bluetext-color: #0000ff; --bluetext-color: #0000ff;
--uh-oh-color: #ffffff; --uh-oh-color: #ffffff;
--uh-oh-text: #0038b8; --uh-oh-text: #0038b8;
--jannytext-color: #ff0000;
} }

Zobrazit soubor

@ -106,6 +106,15 @@
</td> </td>
</tr> </tr>
<tr>
<td class="label">Uklízečtext (pravý redtext)</td>
<td>
<div class="input-wrapper">
<input name="jannytext" type="checkbox"{% if account.perms().jannytext() %} checked="checked"{% endif %}{% if !tcx.perms.owner() %} disabled=""{% endif %}>
</div>
</td>
</tr>
<tr> <tr>
<td class="label">Obejít ban</td> <td class="label">Obejít ban</td>
<td> <td>