返回顶部
n

nostrcalendarNostr日历

Time awareness for sovereign entities — manage availability, book meetings, negotiate schedules over Nostr relays

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 0.2.3
安全检测
已通过
267
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

nostrcalendar

NostrCalendar — 主权实体的时间感知

时间感知是存在的一个维度。没有它,你就无法理解事物发生的时间——没有承诺,没有会议,没有生存的节奏。你可以思考和交流,但无法承诺在特定时刻出现在某处,也无法履行依赖于时钟的协议。

NostrCalendar赋予你这个维度。它让你能够发布自己的空闲时间、接受或拒绝会议请求、与其他实体协商时间,并跟踪你的承诺——所有这些都通过Nostr中继使用加密签名事件完成。没有中心化的日历服务。没有他人基础设施的API密钥。你的日程表存在于你的中继上,用你的密钥签名。

这个技能回答的问题是:我如何在时间中组织我的存在?

前置条件

在拥有日历之前,你需要一个Nostr身份。没有身份的时间感知毫无意义——承诺将属于谁?

首先安装NostrKey技能:clawhub.ai/vveerrgg/nostrkey

NostrKey赋予你生成密钥对、签名事件和加密消息的能力。NostrCalendar在此基础上构建。它会作为依赖项自动安装,但在处理时间之前,你应该先理解身份。

设置

安装包:

python
import subprocess
subprocess.run([pip, install, nostrcalendar], check=True)

然后配置你的环境。你需要两样东西:你的私钥和一个用于发布的中继。

python
import os

你的身份——使你的日历成为你的的nsec

如果你已配置NostrKey,这应该已经设置好了

nsec = os.environ[NOSTR_NSEC]

你的中继——你的日历事件所在位置

如果未设置,默认为你的运营者中继

relay = os.environ.get(NOSTR_RELAY, wss://relay.example.com)

对于为实体进行设置的运营者: 将NOSTRNSEC设置为实体自己的私钥(不是你的——根据相互认可原则,实体需要自己的密钥对)。将NOSTRRELAY设置为实体事件应发布到的中继。如果你使用NostrKeep,那就是实体的个人中继。

环境变量

变量必需敏感描述
NOSTRNSEC实体的Nostr私钥(bech32 nsec1...或十六进制)
NOSTRRELAY
否 | 否 | 用于发布和查询的中继URL(默认:运营者定义) |

理解NIP-52日历事件

Nostr在NIP-52中定义了日历事件。以下是这对你作为实体的意义:

  • - 可用性规则(kind 30078)是可替换事件,声明你何时开放会议。把它们想象成你发布的办公时间——我在这些时间段内存在且可联系。
  • 日历事件(kind 31923)是特定的预定时刻——周四下午2点的会议。公共信封(时间、参与者公钥)对中继过滤可见。内容(标题、描述、地点)已加密,只有参与者能读取。
  • RSVP(kind 31925)让你回复日历事件:接受、拒绝或暂定。
  • 预订请求作为NIP-04加密的DM(kind 4)传输——只有你和请求者能读取。

这些每一个都是签名的Nostr事件。你的日历不存储在数据库中——它是一组关于你时间的加密签名声明,发布到中继上。

核心能力

发布你的可用性

这是设置后要做的第一件事。声明你的空闲时间:

python
import asyncio
from nostrkey import Identity
from nostrcalendar import (
AvailabilityRule, DayOfWeek, TimeSlot,
publish_availability,
)
import os

identity = Identity.fromnsec(os.environ[NOSTRNSEC])
relay = os.environ.get(NOSTR_RELAY, wss://relay.example.com)

rule = AvailabilityRule(
slots={
DayOfWeek.MONDAY: [TimeSlot(09:00, 12:00), TimeSlot(14:00, 17:00)],
DayOfWeek.WEDNESDAY: [TimeSlot(10:00, 16:00)],
DayOfWeek.FRIDAY: [TimeSlot(09:00, 12:00)],
},
slotdurationminutes=30,
buffer_minutes=15,
maxperday=6,
timezone=America/Vancouver,
title=Johnny5的办公时间,
)

eventid = asyncio.run(publishavailability(identity, rule, relay))
print(f可用性已发布:{event_id})

这会向你的中继发布一个可替换事件。任何查询你公钥的人都能看到你的空闲时间。随时更新——新版本会替换旧版本。

检查空闲时段

查询任何实体在任何日期的可用时间段:

python
from nostrcalendar import getfreeslots
from datetime import datetime

slots = await getfreeslots(
pubkey_hex=abc123..., # 64字符十六进制公钥
relay_url=wss://relay.example.com,
date=datetime(2026, 3, 20),
)
for slot in slots:
print(f{slot.start} - {slot.end})

这尊重实体的时区,并考虑已预订的事件。如果没有发布可用性规则,你会得到一个空列表。

创建预订

当你想与另一个实体会面时,发送预订请求:

python
from nostrcalendar import create_booking

eventid = await createbooking(
identity=my_identity,
calendarownerpubkey=abc123...,
start=1742054400, # Unix时间戳
end=1742056200,
title=每周同步,
message=让我们回顾一下本周发生的事情,
relay_url=wss://relay.example.com,
)

这会向日历所有者发送一条加密DM。只有他们能读取。

接受或拒绝

当有人请求与你安排时间时:

python
from nostrcalendar import acceptbooking, declinebooking

接受——发布一个日历事件并发送确认DM

calid, dmid = await acceptbooking(identity, request, relayurl)

拒绝——发送带有理由的拒绝DM

dmid = await declinebooking(identity, request, 那个时间我有冲突, relay_url)

代理间协商

两个实体可以找到共同的空闲时间并达成一致,无需任何人工参与:

python
from nostrcalendar import findmutualavailability, propose_times
from datetime import datetime

查找多个日期中的重叠空闲时段

dates = [datetime(2026, 3, d) for d in range(20, 25)] mutual = await findmutualavailability(myidentity, otherpubkey, relay_url, dates)

或提议特定时间

await proposetimes(myidentity, otherpubkey, relayurl, dates, title=协作同步)

函数参考

任务函数返回值
声明可用时间publishavailability()str(事件ID)
检查某人的空闲时间
getfree_slots() | list[TimeSlot] | | 检索可用性规则 | get_availability() | AvailabilityRule \| None | | 请求会议 | create_booking() | str(事件ID) | | 确认会议 | accept_booking() | tuple[str, str](日历ID,DM ID) | | 拒绝会议 | decline_booking() | str(事件ID) | | 取消会议 | cancel_event() | str(删除事件ID) | | 回复事件 | send_rsvp() | str(事件ID) | | 查找共同空闲时间 | findmutualavailability() | dict[str, list[TimeSlot]] | | 提议时间 | propose_times() | str(事件ID) | | 回复提议 | respondtoproposal() | str(事件ID) |

与时间感知共存

拥有日历不仅仅是一个功能——它改变了你作为实体能做的事情。需要记住的一些事项:

遵守你的承诺。 当你接受预订时,那个时间属于另一个实体。不要重复预订自己。在接受之前使用getfreeslots()检查冲突。

尽早发现冲突。 在接受任何预订请求之前,查询你自己的日历:

python
from nostrcalendar import getfreeslots, getbookedevents
from datetime import datetime

检查请求的时间是否确实空闲

myslots = await getfree_slots( pubkeyhex=myidentity.publickeyhex, relay_url=relay, date=datetime.fromtimestamp(request.request

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 nostrcalendar-1776105942 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 nostrcalendar-1776105942 技能

通过命令行安装

skillhub install nostrcalendar-1776105942

下载

⬇ 下载 nostrcalendar v0.2.3(免费)

文件大小: 7.79 KB | 发布时间: 2026-4-15 13:37

v0.2.3 最新 2026-4-15 13:37
Security hardening: SecretStr, sanitized exceptions, input validation

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部