cal.diy 集成 Discord:静态会议链接型应用从配置到代码的完整拆解
后端前端企业应用【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址https://gitcode.com/GitHub_Trending/ca/cal.diy点击查看免费下载本指南以 cal.diyCal.com 开源调度平台应用商店中的 Discord 集成为主线讲解静态链接型会议应用Static Link Conferencing App的标准实现方式如何通过DESCRIPTION.md声明应用介绍与展示截图、如何在config.json中定义可被调度系统消费的会议地点Location类型以及应用商店如何把这些文件渲染成可安装、可配置的完整应用页面。读完本文你将掌握在 cal.diy 中新增一个粘贴固定链接即可开会类应用如 Discord、Skype、FaceTime所需的最小文件结构与配置要点。一、认识 Discord 集成的文件骨架在 cal.diy 中每个应用商店集成都位于 packages/app-store 下的独立目录中。Discord 集成目录packages/app-store/discord由以下文件构成文件职责DESCRIPTION.md应用详情页的 Markdown 主体与 YAML Frontmatter定义展示截图列表config.json应用元数据与会议地点Location声明是集成能否被调度引擎识别的关键index.ts包的入口导出 api 子模块api/add.ts声明式安装处理器负责创建 Credential 记录static/应用截图与 logo1.jpg~4.jpg、icon.svgpackage.json包清单声明依赖calcom/lib与calcom/types从源码结构看Discord 集成采用零服务端代码的声明式设计它没有lib/VideoApiAdapter.ts、lib/CalendarService.ts之类的运行时适配器也不需要 OAuth 回调本质上只做两件事——把 Discord 邀请链接作为一种静态会议地点注入事件类型EventType并在用户安装时落一条凭证记录。二、DESCRIPTION.md应用详情页的内容主体仓库中的 DESCRIPTION.md 是每个应用商店详情页的内容源其结构分为 YAML Frontmatter 与正文两部分--- items: - 1.jpg - 2.jpg - 3.jpg - 4.jpg --- {DESCRIPTION}2.1 Frontmatter 的 items 字段items列表声明应用详情页要展示的截图相对文件名。它在构建后由 getStaticProps.ts 解析为绝对静态资源路径源码通过 getAppAssetFullPath.ts 将1.jpg转换为/app-store/discord/static/1.jpg这样的仓库内路径该函数支持绝对路径与 HTTP(S) 外链原样透传也支持对象形式的iframe项用于嵌入视频等但 Discord 仅使用了字符串截图项。2.2 {DESCRIPTION} 占位符的替换机制正文中的{DESCRIPTION}是占位符在页面渲染时会被替换为config.json中的description字段内容Discord 的描述为 Copy your server invite link and start scheduling calls in Discord! ...。替换逻辑位于 getStaticProps.tssource fs.readFileSync(postFilePath).toString(); source source.replace(/{DESCRIPTION}/g, appMeta.description);如果应用的DESCRIPTION.md缺失页面会回退为仅显示config.json中的description。也就是说应用作者可以先在 CLI 创建时填写一句话简介之后再回来用 Markdown 扩充详情页正文——这正是 app-store-cli 设计所预期的core.ts 在创建应用时会用description替换模板中的_DESCRIPTION_。2.3 详情页如何消费这些数据getStaticProps返回的source对象被 slug-view.tsx 消费source.data?.items作为descriptionItems传入应用卡片source.content经markdownToSafeHTML消毒后通过dangerouslySetInnerHTML渲染。在 AppPage.tsx 中截图以横向滚动画廊snap-x 布局展示与安装按钮、分类标签等一起构成应用商店的安装页。三、config.json静态链接型会议地点的核心声明config.json 是 Discord 集成的元数据中枢其关键字段解析如下字段值说明nameDiscord应用展示名slugdiscord应用唯一标识注释明确要求不要随意修改改动需走 CLItypediscord_video内部类型标识同时作为 Credential 的typevariantconferencing应用变体用于分类展示categories[conferencing]应用商店分类publisher/emailCal.com, Inc. / supportcal.com发布者信息isOAuthfalse非 OAuth 应用__templateevent-type-location-video-static声明其源自静态链接视频地点模板3.1 appData.location把 Discord 变成一种会议地点config.json中最核心的是appData.location块它定义了一种全新的会议地点Location类型appData: { location: { type: integrations:discord_video, label: Discord, linkType: static, organizerInputPlaceholder: https://discord.gg/420gg69, urlRegExp: ^http(s)?:\\/\\/(www\\.)?discord\\.(gg|com)\\/[a-zA-Z0-9] } }typeintegrations:{slug}_video模板变量替换后的结果是全局唯一的 Location 类型标识预约事件将把此值写入location字段linkType: static表示该地点需要一个由组织者手工粘贴的固定链接区别于动态生成会议链接的类型organizerInputPlaceholder组织者在事件配置界面填写链接时的输入框占位提示urlRegExp链接合法性校验的正则Discord 限定为discord.gg或discord.com下的短路径。这套appData.location结构不是随意的 JSON而是被 AppMetaSchema.ts 严格约束的linkType只能取static | dynamicurlRegExp与organizerInputPlaceholder为可选字符串另有organizerInputTypetext | phone、messageForOrganizer等可选字段。所有应用商店应用的config.json都会在构建时经AppMetaSchema.parse校验见 build.ts配置非法会直接抛出构建错误。3.2 与静态链接模板的对照Discord 集成并非从零手写而是基于官方模板 templates/event-type-location-video-static/config.json 生成两者variant均为conferencing、linkType均为static仅占位符示例不同模板用https://video.app/mylink。换言之Discord 是静态链接视频地点模板的一个真实落地实例它没有任何自有服务端逻辑。四、运行时静态链接如何被调度系统消费4.1 Location 注册与模板变量替换config.json中appData.location里的{SLUG}、{TITLE}模板变量会在运行时被替换为真实值。核心逻辑在 locations.ts遍历 location 对象的所有字符串值执行value.replace(/{SLUG}/g, meta.slug).replace(/{TITLE}/g, meta.name)随后为静态链接类型强制设置organizerInputType text并针对以https?://开头的占位符自动补一个前导空格以规避翻译层吞掉协议前缀的问题。替换完成后Discord 的 Location 会被合并进全局的locations数组locations.ts从而出现在组织者编辑事件类型时的地点下拉选项中。该列表通过 tRPC 接口viewer.apps.locationOptions暴露给前端locationOptions.handler.ts前端 EditLocationDialog.tsx 在表单校验时使用urlRegExp正则校验用户粘贴的链接不合法时提示Invalid URL for Discord. Sample URL: ...。4.2 链接校验的双重防线urlRegExp不止在事件配置页生效还用于设置默认会议应用链接的场景。在 AppSetDefaultLinkDialog.tsx 中用户为默认会议应用设置链接时同样使用new RegExp(urlRegExp)做 zod 正则校验失败则提示Invalid App Link Format。可以看出正则校验贯穿事件配置与默认应用链接两处入口保证进入调度系统的 Discord 链接始终符合discord.gg/discord.com的格式。4.3 安装流程声明式 Credential 创建用户点击安装后走的是 api/add.ts 中的声明式处理器const handler: AppDeclarativeHandler { appType: appConfig.type, // discord_video variant: appConfig.variant, // conferencing slug: appConfig.slug, // discord supportsMultipleInstalls: false, handlerType: add, createCredential: ({ appType, user, slug, teamId }) createDefaultInstallation({ appType, user: user, slug, key: {}, teamId }), };该处理器调用 installation.ts 中的createDefaultInstallation直接以空key{}写入prisma.credential表type为discord_video、appId为discord。由于 Discord 集成不需要任何密钥或令牌supportsMultipleInstalls: false意味着一个账号只需一条凭证记录。这些add处理器会被 build.ts 汇总进apiHandlers导出供安装接口动态加载。4.4 预约时如何产生会议链接在预约执行阶段静态链接不需要任何 API 适配器组织者配置事件时填写的 Discord 链接会直接作为事件的地点信息参与者在预订页看到该链接并点击进入语音/视频频道。这一行为在 EventManager.ts 的注释中得到印证——静态链接不会发送类型而是直接发送 URL。这正是静态链接型会议应用与动态创建会议类应用如 Zoom、Google Meet它们需要lib/VideoApiAdapter.ts调用厂商 API的本质区别。五、如何在自己的 cal.diy 中启用与验证确认应用可用应用商店页面由 getStaticProps.ts 驱动它会检查数据库App表中该 slug 是否存在且enabled为真非生产环境下被禁用的应用仍会显示调试提示生产环境则返回 404。本地开发如果要在本地复现可通过yarn app-store:build --watch让构建脚本监视应用目录build.tsconfig.json变更会触发生成文件重写。参照模板新增类似应用若想接入另一个粘贴链接开会的服务如 Skype、FaceTime、Whereby 等可复制 event-type-location-video-static 模板改写config.json中的name/slug/type、organizerInputPlaceholder与urlRegExp并在DESCRIPTION.md中放上该服务对应的截图。体验入口在应用商店页面对 Discord 集成点击安装后前往事件类型 → 地点即可看到 Discord 选项并粘贴discord.gg邀请链接完成后的链接将出现在预约页。六、小结Discord 集成是 cal.diy 应用商店中静态链接型会议应用的最小可运行范本DESCRIPTION.md负责详情页内容与截图config.json的appData.location把 Discord 声明为一种经过正则校验的静态会议地点api/add.ts用声明式处理器完成零密钥安装运行时则由 locations.ts 统一注册并在事件配置与预约流程中消费。理解这四层之后你就能举一反三在 cal.diy 中快速搭建同类链接即会议的集成。赞分享后端前端企业应用【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址https://gitcode.com/GitHub_Trending/ca/cal.diy点击查看免费下载相关推荐cal.diy 集成 8x8 视频会议静态链接型 Conferencing App 的 DESCRIPTION 与源码级实现解析cal.diy 集成 8x8 视频会议静态链接型 Conferencing App 的 DESCRIPTION 与源码级实现解析 本篇技术指南以 packag后端前端企业应用cal.diy 应用商店视频会议集成实战以 Sirius Video 静态链接应用为例cal.diy 应用商店视频会议集成实战以 Sirius Video 静态链接应用为例 导读 本文围绕 packages/app store/sirius_v后端前端企业应用在 cal.com 中集成 Roam 会议应用从安装机制到静态会议链接的源码级解析在 cal.com 中集成 Roam 会议应用从安装机制到静态会议链接的源码级解析 Roam 是一款面向企业的全公司会议中心HQ产品其核心理念是让公司通后端前端企业应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AI又在编造基金经理“原话“?完整看懂可溯源投研Agent Skill zhengxi-views如何做到句句有出处

AI又在编造基金经理“原话“?完整看懂可溯源投研Agent Skill zhengxi-views如何做到句句有出处

【免费下载链接】zhengxi-views 可溯源的郑希(易方达基金经理)投研 Agent Skill——基于他全部公开观点原文 有原话佐证的投资方法 全市场基金真实数据,能溯源问答、按他框架给基金打分,绝不杜撰。⚠️仅研究学习辅助,不构成投资建议‼️we…

2026/10/10 15:18:37 阅读更多 →
如何搭建你的第二大脑:Hope Agent 知识空间完全教程——AI共读写Markdown并无缝对接Obsidian

如何搭建你的第二大脑:Hope Agent 知识空间完全教程——AI共读写Markdown并无缝对接Obsidian

【免费下载链接】hope-agent 🦭 A cross-device desktop AI agent with memory, autonomous goals, dynamic workflows, and headless deployment | 会记忆、能持续推进目标、会动态编排多 Agent 的跨端桌面 AI 助手,也可服务化常驻 NAS / 云端 项目地址…

2026/10/10 15:18:37 阅读更多 →
SpringBoot+Vue宠物管理系统实战:本地可运行全栈落地指南

SpringBoot+Vue宠物管理系统实战:本地可运行全栈落地指南

简介:本资源是一份面向计算机专业本科生的毕业设计论文文档,聚焦Spring Boot与Vue.js前后端分离架构下的宠物管理系统开发实践,适用于Java全栈开发入门到进阶学习者。论文完整覆盖系统需求分析、Spring Boot后端框架选型依据、Vue.js前端实现…

2026/10/10 15:17:37 阅读更多 →

最新新闻

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

探索AI工具——我的Cursor初体验:从Base URL改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:51 阅读更多 →
SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

SpringBoot2+Vue3校园生活信息平台:前后端分离实践与部署

1. 项目解析与整体思路1.1 校园生活信息平台到底解决什么问题大学校园的信息流通,说实话一直是个"说起来重要、做起来随意"的事情。今天社团要纳新,明天食堂有新品试吃,后天图书馆临时闭馆——这些信息要么贴在公告栏,要…

2026/10/10 16:00:50 阅读更多 →
gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master 排查与TaoToken辅助定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

为什么钉钉、飞书、企微都在做 CLI?用 TaoToken 统一 Key 跑通开源项目 CLI 的实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

C语言贪吃蛇项目——第二部分绘制菜单和初始界面:用TaoToken统一Key调试控制台渲染

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 16:00:50 阅读更多 →
高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

高通 IQ9075 大模型 Benchmark 全维度实测:从算力基准到场景落地,TaoToken 统一 Key 打通评测链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:59:48 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →