Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions locales/en.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ cmd_unmute = 🔊 <b>User unMuted successfully!</b>
e_issue_opened =
🔘 Issue: <b>{ $issueTitle }</b>.

👤 Author: <a href="{ $userUrl }">{ $user }</a>
👤 Author: <a href="{ $userUrl }">{ $user }</a> { $telegramStatus }

— <a href="{ $issueUrl }">{ $issueUrl }</a>

Expand All @@ -170,7 +170,7 @@ e_issue_opened =
e_pull_request_closed_merged =
🌳 PR Merged!

👤 Author: <a href="{ $userUrl }">{ $user }</a>
👤 Author: <a href="{ $userUrl }">{ $user }</a> { $telegramStatus }

— <a href="{ $prUrl }">{ $prUrl }</a>

Expand All @@ -179,7 +179,7 @@ e_pull_request_closed_merged =
e_pull_request_opened =
🌴 PR Created: <b>{ $prTitle }</b>

👤 Author: <a href="{ $userUrl }">{ $user }</a>!
👤 Author: <a href="{ $userUrl }">{ $user }</a> { $telegramStatus }!

— <a href="{ $prUrl }">{ $prUrl }</a>

Expand Down Expand Up @@ -211,14 +211,14 @@ e_repository_created =
{ $repoHashtag } #new_repo

e_star_created =
🌟 <a href="{ $userUrl }">{ $user }</a> gave star number { $starNumber } to <a href="{ $repoUrl }">{ $repoName }</a>.
🌟 <a href="{ $userUrl }">{ $user }</a> { $telegramStatus } gave star number { $starNumber } to <a href="{ $repoUrl }">{ $repoName }</a>.

{ $repoHashtag } #star

e_issue_assigned =
👥 Issue Assigned: <b>{ $issueTitle }</b>.

👤 Assignee: <a href="{ $assigneeUrl }">{ $assignee }</a>
👤 Assignee: <a href="{ $assigneeUrl }">{ $assignee }</a> { $telegramStatus }

— <a href="{ $issueUrl }">{ $issueUrl }</a>

Expand Down
4 changes: 1 addition & 3 deletions src/bot/bot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,7 @@ export class Bot extends GrammyBot<BotContext> {

this.use(userCommands);

const isAdmin = (ctx: Context) =>
ctx.from !== undefined &&
config.bot.adminIds.includes(ctx.from.id);
const isAdmin = (ctx: Context) => ctx.from !== undefined && config.bot.adminIds.includes(ctx.from.id);

this.filter(isAdmin).use(adminCommands);

Expand Down
16 changes: 14 additions & 2 deletions src/bot/commands/private/link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,27 @@ export async function handler(ctx: BotContext<z.infer<typeof schema>>) {
const repliedMessage = ctx.message.reply_to_message;
const isActualReply = repliedMessage && !repliedMessage.forum_topic_created;

const { ghUsername, tgUsername } = ctx.args;
const tgId = isActualReply ? repliedMessage.from?.id : null;
const { ghUsername } = ctx.args;
let { tgUsername } = ctx.args;

const from = isActualReply ? repliedMessage.from : undefined;
const tgId = from?.id ?? null;
const tgName = from ? [from.first_name, from.last_name].filter(Boolean).join(" ") : null;

if (from?.username) {
const result = zs.tgUsername.safeParse(from.username);
if (result.success) {
tgUsername = result.data;
}
}

if (!tgId && !tgUsername) {
return await ctx.html.replyToMessage(ctx.t("cmd_link_no_user"));
}

const set: SQLiteInsertValue<typeof s.contributors> = { ghUsername };
if (tgId) set.tgId = tgId;
if (tgName) set.tgName = tgName;
if (tgUsername) set.tgUsername = tgUsername;

await db
Expand Down
45 changes: 32 additions & 13 deletions src/lib/github/webhooks/handlers/_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@ import type { components } from "@octokit/openapi-webhooks-types";
import { bot } from "#bot";
import { db, schema } from "#db";

import { escapeHtml } from "../../../escape-html.ts";

export interface User {
user: string;
userUrl: string;
ghUsername: string;
ghProfileUrl: string;
ghDisplayname: string;
tgId?: number | null;
tgUsername?: string | null;
tgDisplayName?: string | null;
telegramStatus: string;
}

type SimpleUser = Pick<components["schemas"]["simple-user"], "html_url" | "login" | "name">;
Expand Down Expand Up @@ -35,24 +42,36 @@ export async function isUserMuted(githubUsername: string): Promise<boolean> {
return !!contributor?.isMuted;
}

export async function getUser(simpleUser: SimpleUser): Promise<User> {
const ghUsername = simpleUser.login;

let user = simpleUser.name ?? ghUsername;
let userUrl = simpleUser.html_url;
export async function getUser(githubUser: SimpleUser): Promise<User> {
const ghUsername = githubUser.login;

const dbUser = await db.query.contributors.findFirst({
const contributor = await db.query.contributors.findFirst({
where: (f, o) => o.eq(f.ghUsername, ghUsername),
});

if (!dbUser?.ghUsername) {
if (!contributor) {
await db.insert(schema.contributors).values({ ghUsername });
}

if (dbUser?.tgId && dbUser?.tgName) {
user = dbUser.tgName;
userUrl = `tg://user?id=${dbUser.tgId}`;
let telegramStatus = "(-)";
const isLinked = contributor?.tgId || contributor?.tgUsername;
if (isLinked) {
if (contributor.tgUsername) {
telegramStatus = `(@${escapeHtml(contributor.tgUsername)})`;
} else if (contributor.tgName) {
telegramStatus = `(<a href="tg://user?id=${contributor.tgId}">${escapeHtml(contributor.tgName)}</a>)`;
} else {
telegramStatus = `(<a href="tg://user?id=${contributor.tgId}">-</a>)`;
}
}

return { user, userUrl };
return {
ghUsername,
ghProfileUrl: githubUser.html_url,
ghDisplayname: githubUser.name ?? ghUsername,
tgId: contributor?.tgId,
tgUsername: contributor?.tgUsername,
tgDisplayName: contributor?.tgName,
telegramStatus,
};
}
5 changes: 3 additions & 2 deletions src/lib/github/webhooks/handlers/issues-assigned.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ export const issuesAssignedCallback: HandlerFunction<"issues.assigned", unknown>
await bot.announce(
botText("e_issue_assigned", {
issueTitle: escapeHtml(issue.title),
assignee: escapeHtml(assignee.user),
assigneeUrl: assignee.userUrl,
assignee: escapeHtml(assignee.ghDisplayname),
telegramStatus: assignee.telegramStatus,
assigneeUrl: assignee.ghProfileUrl,
issueUrl: issue.html_url,
repoHashtag: escapeHtml(repoHashtag),
}),
Expand Down
5 changes: 3 additions & 2 deletions src/lib/github/webhooks/handlers/issues-opened.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ export const issuesOpenedCallback: HandlerFunction<"issues.opened", unknown> = a
await bot.announce(
botText("e_issue_opened", {
issueTitle: escapeHtml(issue.title),
user: escapeHtml(user.user),
userUrl: escapeHtml(user.userUrl),
user: escapeHtml(user.ghDisplayname),
telegramStatus: user.telegramStatus,
userUrl: escapeHtml(user.ghProfileUrl),
issueUrl: escapeHtml(issue.html_url),
repoHashtag: escapeHtml(repoHashtag),
}),
Expand Down
5 changes: 3 additions & 2 deletions src/lib/github/webhooks/handlers/pull-request-closed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ export const pullRequestClosedCallback: HandlerFunction<"pull_request.closed", u

await bot.announce(
botText("e_pull_request_closed_merged", {
user: escapeHtml(user.user),
userUrl: escapeHtml(user.userUrl),
user: escapeHtml(user.ghDisplayname),
telegramStatus: user.telegramStatus,
userUrl: escapeHtml(user.ghProfileUrl),
prUrl: escapeHtml(pr.html_url),
repoHashtag: escapeHtml(repoHashtag),
}),
Expand Down
5 changes: 3 additions & 2 deletions src/lib/github/webhooks/handlers/pull-request-opened.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ export const pullRequestOpenedCallback: HandlerFunction<"pull_request.opened", u
await bot.announce(
botText("e_pull_request_opened", {
prTitle: escapeHtml(pr.title),
user: escapeHtml(user.user),
userUrl: escapeHtml(user.userUrl),
user: escapeHtml(user.ghDisplayname),
telegramStatus: user.telegramStatus,
userUrl: escapeHtml(user.ghProfileUrl),
prUrl: escapeHtml(pr.html_url),
repoHashtag: escapeHtml(repoHashtag),
}),
Expand Down
8 changes: 4 additions & 4 deletions src/lib/github/webhooks/handlers/star-created.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ import { botText, getRepoHashtag, getUser } from "./_utils.ts";

export const starCreatedCallback: HandlerFunction<"star.created", unknown> = async (event) => {
const user = await getUser(event.payload.sender);
const githubUrl = event.payload.sender.html_url;
const repo = event.payload.repository;
const repoHashtag = getRepoHashtag(repo.name);

await bot.announce(
botText("e_star_created", {
user: escapeHtml(user.user),
userUrl: escapeHtml(githubUrl),
user: escapeHtml(user.ghDisplayname),
userUrl: escapeHtml(user.ghProfileUrl),
telegramStatus: user.telegramStatus,
repoName: escapeHtml(repo.name),
repoUrl: escapeHtml(repo.html_url),
repoHashtag: escapeHtml(repoHashtag),
starNumber: repo.stargazers_count,
}),
{ link_preview_options: { prefer_small_media: true, url: githubUrl } },
{ link_preview_options: { prefer_small_media: true, url: user.ghProfileUrl } },
);
};
Loading