4const thisURL = parseProject(import.meta.url).links.self.latest;
5
6export async function notify(message: string) {
7 await email({ subject: message, text: `Email sent from ${thisURL}` });
8}
9const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
10
11export async function uptimeCheck(url: string, attempt = 1) {
12 let reason: string = "";
13 let status: number | null = null;
1/** @jsxImportSource npm:react@18.2.0 */
2
3export function AccountsList({ accounts }) {
4 return (
5 <section>
18import { LinearIssue, LinearTicket } from "../backend/types.ts";
19
20export default async function handleSlashCommand(req: Request) {
21 const formData = await req.formData();
22 const command = formData.get("command");
143}
144
145function buildSetupModal(
146 ticket: LinearIssue,
147 ticketsToTrack: LinearTicket[],
9);
10
11export async function lookupUserByEmail(
12 email: string,
13): Promise<SlackUser | null> {
21}
22
23export async function sendDirectMessage(
24 userId: string,
25 text: string,
31}
32
33export async function openModal(
34 triggerId: string,
35 view: Record<string, any>,
10import { SlackModalPayload } from "../backend/types.ts";
11
12export default async function handleModalSubmit(payload: SlackModalPayload) {
13 if (payload.view.callback_id !== "setup_reminder") {
14 return new Response("", { status: 200 });
10import handleModalSubmit from "./slack/modalSubmit.ts";
11
12export default async function main(req: Request) {
13 const url = new URL(req.url);
14
8});
9
10export async function getLinearTicket(ticketId: string): Promise<LinearIssue> {
11 const query = `
12 query IssueWithChildren($id: String!) {
69}
70
71export function extractTicketId(input: string): string {
72 // Handle Linear URLs like https://linear.app/team/issue/TEAM-123
73 const urlMatch = input.match(/([A-Z]+-\d+)/);
2import { Reminder } from "./types.ts";
3
4export async function initDatabase() {
5 await sqlite.execute(`
6 CREATE TABLE IF NOT EXISTS reminders (
21}
22
23export async function createReminder(reminder: Omit<Reminder, 'id'>): Promise<number> {
24 const result = await sqlite.execute({
25 sql: `
47
48// Map SQLite row arrays to Reminder objects so it's cleaner to read
49function rowToReminder(row: any[]): Reminder {
50 return {
51 id: row[0],
63}
64
65export async function getActiveReminders(): Promise<Reminder[]> {
66 const result = await sqlite.execute("SELECT * FROM reminders WHERE active = 1");
67 return result.rows.map(rowToReminder);
68}
69
70export async function updateReminder(
71 id: number,
72 updates: Partial<Reminder>
82}
83
84export async function getRemindersByCreator(creatorId: string): Promise<Reminder[]> {
85 const result = await sqlite.execute({
86 sql: "SELECT * FROM reminders WHERE creator_slack_id = ? AND active = 1",
91}
92
93export async function getAllRemindersByCreator(creatorId: string): Promise<Reminder[]> {
94 const result = await sqlite.execute({
95 sql: "SELECT * FROM reminders WHERE creator_slack_id = ?",
99}
100
101export async function clearAllReminders(): Promise<void> {
102 await sqlite.execute("UPDATE reminders SET active = 0");
103}
21 * Orchestrates the daily reminder check. This is the main cron entrypoint.
22 */
23export default async function checkReminders() {
24 const TESTING = true; // TODO: change this to false to put this into production
25
55}
56
57function shouldProcessReminder(
58 reminder: Reminder,
59 now: Date,
67}
68
69function buildSummary(
70 runTimestamp: string,
71 totalChecked: number,
80}
81
82async function processReminder(reminder: Reminder): Promise<number> {
83 console.log(`\n --- Processing ${reminder.ticket_title} ---`);
84
Helper function to send Discord messages
Simple functional CSS library for Val Town
import { OpenAI } from "https://esm.town/v/std/openai";
export default async function(req: Request): Promise<Response> {
if (req.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
LangChain (https://langchain.com) Ambassador, KubeSphere (https://kubesphere.io) Ambassador, CNCF OpenFunction (https://openfunction.dev) TOC Member.