templateTwitterAlertREADME.md4 matches
31Refer to [Twitter's search operators](https://socialdata.gitbook.io/docs/twitter-tweets/retrieve-search-results-by-keyword#endpoint-parameters) to fine-tune your query.
3233### 4. Test API call
34Set `isProd = false` in the code if you are testing, to ensure there are enough tweets to display. <br>
35Toggle it back to `true` when you're ready to run this cron job in production and actuall send notifications.
6061### NOTE: Usage Limits
62This val uses the SocialData API for Twitter data:
6364- **Proxies via Val Town's [SocialDataProxy](https://www.val.town/v/stevekrouse/socialDataProxy)**: Limited to 10 cents per day for [**Val Town Pro users**](https://www.val.town/pricing). This API is *only* for Pro users.
65- **Need more calls?** Sign up for your own [SocialData API token](https://socialdata.tools) and configure the [`socialDataSearch`](https://www.val.town/v/stevekrouse/socialDataSearch) function.
Notion_GCal_Sync_1README.md10 matches
11### 1. Google Calendar Setup
121. Create a Google Cloud project at https://console.cloud.google.com/
132. Enable the Google Calendar API
143. Create OAuth2 credentials (client ID and client secret)
154. Set up OAuth consent screen
165. Use the OAuth playground (https://developers.google.com/oauthplayground/) to:
17- Authorize the Calendar API (https://www.googleapis.com/auth/calendar.readonly)
18- Exchange authorization code for tokens
19- Save the refresh token
21### 2. Notion Setup
221. Create a Notion integration at https://www.notion.so/my-integrations
232. Get your Notion API key
243. Create a database in Notion for meeting pages with these properties:
25- Title (title)
305. Get the database ID from the URL (the part after the workspace name and before the question mark)
3132### 3. SERP API Setup (for better user information)
331. Sign up for a SERP API account at https://serpapi.com/
342. Get your API key
353. Add it as an environment variable
3640- `GOOGLE_CLIENT_SECRET`: Your Google OAuth client secret
41- `GOOGLE_REFRESH_TOKEN`: Refresh token for your Google account
42- `NOTION_API_KEY`: Your Notion API key
43- `NOTION_DATABASE_ID`: ID of the Notion database where meeting pages will be created
44- `TEAM_DOMAIN`: Your team's email domain (e.g., "val.town")
45- `SERP_API_KEY`: Your SERP API key for enhanced user information
4647### 5. Set Cron Schedule
50## Project Structure
51- `index.ts`: Main cron job that runs daily
52- `googleCalendar.ts`: Functions for interacting with Google Calendar API
53- `notion.ts`: Functions for creating and updating Notion pages
54- `userInfo.ts`: Functions for gathering information about meeting participants
593. It identifies meetings with exactly one external participant (not from your team domain)
604. For each user meeting, it:
61- Gathers information about the participant using their email and SERP API
62- Creates a Notion page with meeting details and participant information
63- Adds sections for meeting notes and action items
MiniAppStarter1neynar.ts2 matches
1const baseUrl = "https://api.neynar.com/v2/farcaster/";
23export async function fetchNeynarGet(path: string) {
7"Content-Type": "application/json",
8"x-neynar-experimental": "true",
9"x-api-key": "NEYNAR_API_DOCS",
10},
11});
MiniAppStarter1index.tsx2 matches
19}));
2021app.get("/api/counter/get", async c => c.json(await db.get("counter")));
22app.get("/api/counter/increment", async c => c.json(await db.set("counter", (await db.get("counter") || 0) + 1)));
2324app.get("/frontend/**/*", c => serveFile(c.req.path, import.meta.url));
MiniAppStarter1image.tsx3 matches
8485const loadEmoji = (code) => {
86// const api = `https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/${code.toLowerCase()}.svg`
87const api = `https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/${code.toLowerCase()}_color.svg`;
88return fetch(api).then((r) => r.text());
89};
90
MiniAppStarter1App.tsx3 matches
53<div className="">✷ Farcaster mini app manifest + webhook + embed metadata</div>
54<div className="">✷ Farcaster notifications (storing tokens, sending recurring notifications, ...)</div>
55<div className="">✷ Neynar API integration for Farcaster data</div>
56<div className="">✷ Hosted on Val Town (instant deployments on save)</div>
57<div className="">
6768function Database() {
69const queryFn = () => fetch("/api/counter/get").then((r) => r.json());
70const { data, refetch } = useQuery({ queryKey: ["counter"], queryFn });
71return (
73{/* <h2 className="font-semibold">Database Example</h2> */}
74<div className="">Counter value: {data}</div>
75<Button variant="outline" onClick={() => fetch("/api/counter/increment").then(refetch)}>
76Increment
77</Button>
Notion_GCal_Syncnotion.ts5 matches
18*/
19export async function createMeetingPage(data: MeetingPageData): Promise<string> {
20const notionApiKey = Deno.env.get("NOTION_API_KEY");
21const databaseId = Deno.env.get("NOTION_DATABASE_ID");
22
23if (!notionApiKey || !databaseId) {
24throw new Error("Missing Notion API credentials in environment variables");
25}
26
261
262// Create the page in Notion
263const response = await fetch("https://api.notion.com/v1/pages", {
264method: "POST",
265headers: {
266"Authorization": `Bearer ${notionApiKey}`,
267"Notion-Version": "2022-06-28",
268"Content-Type": "application/json"
Notion_GCal_Sync_1userInfo.ts14 matches
1/**
2* Functions for gathering information about meeting participants using SERP API
3*/
41819/**
20* Try to get user information from SERP API
21*/
22async function tryGetSerpApiInfo(email: string, name?: string): Promise<UserInfo | null> {
23const serpApiKey = Deno.env.get("SERP_API_KEY");
24
25if (!serpApiKey) {
26return null;
27}
38
39const response = await fetch(
40`https://serpapi.com/search.json?engine=google&q=${encodeURIComponent(searchQuery)}&api_key=${serpApiKey}`
41);
42
43if (!response.ok) {
44throw new Error(`SERP API error: ${response.status} ${await response.text()}`);
45}
46
127return null;
128} catch (error) {
129console.error("Error fetching data from SERP API:", error);
130return null;
131}
143
144try {
145// Try to get company information using SERP API
146const serpApiKey = Deno.env.get("SERP_API_KEY");
147
148if (serpApiKey) {
149const response = await fetch(
150`https://serpapi.com/search.json?engine=google&q=${encodeURIComponent(domain)}&api_key=${serpApiKey}`
151);
152
221*/
222export async function getUserInfo(email: string, name?: string): Promise<UserInfo> {
223// Try to get detailed information from SERP API
224const serpInfo = await tryGetSerpApiInfo(email, name);
225if (serpInfo) {
226return serpInfo;
Notion_GCal_Sync_1notion.ts5 matches
18*/
19export async function createMeetingPage(data: MeetingPageData): Promise<string> {
20const notionApiKey = Deno.env.get("NOTION_API_KEY");
21const databaseId = Deno.env.get("NOTION_DATABASE_ID");
22
23if (!notionApiKey || !databaseId) {
24throw new Error("Missing Notion API credentials in environment variables");
25}
26
261
262// Create the page in Notion
263const response = await fetch("https://api.notion.com/v1/pages", {
264method: "POST",
265headers: {
266"Authorization": `Bearer ${notionApiKey}`,
267"Notion-Version": "2022-06-28",
268"Content-Type": "application/json"
Notion_GCal_Sync_1googleCalendar.ts2 matches
45}
46
47const tokenResponse = await fetch("https://oauth2.googleapis.com/token", {
48method: "POST",
49headers: {
81
82const calendarId = "primary"; // Use primary calendar
83const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events?timeMin=${encodeURIComponent(timeMin)}&timeMax=${encodeURIComponent(timeMax)}&singleEvents=true&orderBy=startTime`;
84
85const response = await fetch(url, {