Extension Email Calendar Events
Support for organising events/meetings and sending invitations by email.
- Скачивания
- 0
- В избранном
- 0
- Комментарии
- 0
- Просмотры
- 3
Установить скилл
Добавьте инструмент одной командой или скачайте проверенный архив версии.
npx skills add caffeinelabs/skills --skill extension-email-calendar-events- Версия
- 1.0.0+38a113689f27
- Автор
- Владимир Ломтев
- Репозиторий
- caffeinelabs/skills
Как установить
- 1Скопируйте команду из блока установки.
- 2Запустите её в терминале из каталога проекта.
Документация
Email — Calendar Events
Calendar events email extension for Caffeine AI.
Overview
This skill adds support for organising events/meetings and sending iCalendar invitations by email. It provides CRUD operations for calendar events and email-based invitation delivery.
Backend
This component is for organising events/meetings and sending invitations by email
- Internally it builds and attaches an iCalendar file to each attendees's email
- This component does not yet support receiving RSVPs from attendees
To add/update/cancel/delete/get/list calendar events
- Use the prefabricated module
mo:caffeineai-email-calendar-events/calendarEvents.mowhich cannot be modified.
module {
public type State = {
var events : List.List<CalendarEvent>;
var uidMap : Map.Map<Text, Nat>;
};
public func add(
self : State,
uid : Text,
summary : Text,
description : Text,
location : Text,
startTime : Nat64,
endTime : Nat64,
organizer : Mailbox,
attendees : [Attendee]
) : ?CalendarEvent;
public func update(
self : State,
uid : Text,
summary : ?Text,
description : ?Text,
location : ?Text,
startTime : ?Nat64,
endTime : ?Nat64,
organizer : ?Mailbox,
attendees : ?[Attendee]
) : ?CalendarEvent;
public func addAttendees(
self : State,
uid : Text,
attendees : [Attendee]
) : ?CalendarEvent;
public func removeAttendees(
self : State,
uid : Text,
attendees : [Text]
) : ?CalendarEvent;
public func cancel(self : State, uid : Text) : ?CalendarEvent;
public func delete(self : State, uid : Text);
public func get(self : State, uid : Text) : ?CalendarEvent;
// Iterate over all calendar events older to newer
public func iter(self : State) : Iter.Iter<CalendarEvent>;
// Iterate over all calendar events newer to older
public func reverse(self : State) : Iter.Iter<CalendarEvent>;
}
For sending calendar event invittions to attendees by email
- This component depends on extension-email for sending calendar event emails.
- Use the sendCalendarEvent function.
module {
public type CalendarEvent = {
uid : Text;
sequence : Nat32;
method : CalendarEventMethod;
summary : Text;
description : Text;
location : Text;
startTime : Nat64;
endTime : Nat64;
organizer : Mailbox;
attendees : [Attendee];
};
public type CalendarEventMethod = {
#request;
#publish;
#cancel;
};
public type Mailbox = {
email : Text;
name : ?Text;
};
public type Attendee = {
who : Mailbox;
role : CalendarEventRole;
};
public type CalendarEventRole = {
#chair;
#required;
#optional;
#notParticipating;
};
public type SendResult = {
#ok;
#err : Text;
};
public func sendCalendarEvent(fromUsername : Text, event : CalendarEvent) : async SendResult;
};
Example usage for an app which can add/update/cancel/delete/get/list calendar events and send invitations to them by email
import Runtime "mo:core/Runtime";
import Principal "mo:core/Principal";
import Map "mo:core/Map";
import Random "mo:core/Random";
import Set "mo:core/Set";
import Iter "mo:core/Iter";
import Option "mo:core/Option";
import Text "mo:core/Text";
import AccessControl "mo:caffeineai-authorization/access-control";
import MixinAuthorization "mo:caffeineai-authorization/MixinAuthorization";
import EmailClient "mo:caffeineai-email/emailClient";
import CalendarEvents "mo:caffeineai-email-calendar-events/calendarEvents";
import Uuid "mo:caffeineai-email-calendar-events/uuid";
actor {
public type UserProfile = {
name : Text;
email : Text;
};
// Include authorization component
let accessControlState = AccessControl.initState();
include MixinAuthorization(accessControlState, null);
// Store a map of caller principal to UserProfile
var userProfiles = Map.empty<Principal, UserProfile>();
// Store a set of emails for uniqueness check
var emails = Set.empty<Text>();
// Store the calendar events
let calendarEvents = CalendarEvents.new();
public shared ({ caller }) func registerUser(name : Text, email : Text) : async () {
// Check if the user already exists
if (userProfiles.containsKey(caller)) {
Runtime.trap("User already registered");
};
// Check if the email is already used
if (emails.contains(email)) {
Runtime.trap("Email already taken");
};
// Add a user record
userProfiles.add(
caller,
{
name;
email;
}
);
emails.add(email);
};
public shared ({ caller }) func addCalendarEvent(summary : Text, description : Text, location : Text, startTimeMs : Nat64, endTimeMs : Nat64) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can add calendar events");
};
let organiser = userProfiles.get(caller)
?? Runtime.trap("Admin profile not found");
let seed = await Random.blob();
let uid = Uuid.generateV4(seed);
if (
calendarEvents.add(
uid,
summary,
description,
location,
startTimeMs,
endTimeMs,
{
name = ?organiser.name;
email = organiser.email;
},
userProfiles.values().map(
func({ name; email }) {
{
who = { name = ?name; email };
role = #required;
};
}
).toArray()
).isNull()
) {
Runtime.trap("Failed to add calendar event");
};
};
public shared ({ caller }) func updateEventDetails(uid : Text, summary : ?Text, description : ?Text, location : ?Text, startTimeMs : ?Nat64, endTimeMs : ?Nat64) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can update calendar events");
};
if (
calendarEvents.update(
uid,
summary,
description,
location,
startTimeMs,
endTimeMs,
null,
null
).isNull()
) {
Runtime.trap("Failed to update calendar event");
};
};
public shared ({ caller }) func addEventAttendees(uid : Text, attendees : [EmailClient.Attendee]) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can add calendar event attendees");
};
if (calendarEvents.addAttendees(uid, attendees).isNull()) {
Runtime.trap("Failed to add attendees to calendar event");
};
};
public shared ({ caller }) func removeEventAttendees(uid : Text, attendees : [Text]) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can remove calendar event attendees");
};
if (calendarEvents.removeAttendees(uid, attendees).isNull()) {
Runtime.trap("Failed to remove attendees from calendar event");
};
};
public shared ({ caller }) func cancelEvent(uid : Text) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can cancel calendar events");
};
if (calendarEvents.cancel(uid).isNull()) {
Runtime.trap("Failed to cancel calendar event");
};
};
public shared ({ caller }) func listEvents() : async [CalendarEvents.CalendarEvent] {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can list calendar events");
};
calendarEvents.iter().toArray();
};
public shared ({ caller }) func deleteEvent(uid : Text) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can delete calendar events");
};
calendarEvents.delete(uid);
};
public shared ({ caller }) func sendEventInvitation(uid : Text) : async () {
if (not (AccessControl.hasPermission(accessControlState, caller, #admin))) {
Runtime.trap("Unauthorized: Only admins can send calendar event invitations");
};
let event = calendarEvents.get(uid)
?? Runtime.trap("Calendar event not found");
ignore await EmailClient.sendCalendarEvent(
"no-reply",
event
);
};
};
Требования и возможности
Источник пакета
https://github.com/caffeinelabs/skills/tree/38a113689f275bb2efe5fa87e4b151c4a8899e8d/skills/extension-email-calendar-events
Файлы версии
| Путь | Размер | SHA256 |
|---|---|---|
| SKILL.md | 8974 | 43297a1a4ff895f3... |
Частые вопросы
- Как установить Extension Email Calendar Events?
- Используйте команду
npx skills add caffeinelabs/skills --skill extension-email-calendar-eventsили скачайте ZIP-архив. - Можно ли скачать Extension Email Calendar Events бесплатно?
- Да, опубликованную версию можно скачать из маркетплейса бесплатно.
Похожие инструменты
Смотреть всеStory Long Write长篇网文写作。从大纲到正文,辅助长篇网络小说的创作,包括世界观、人物、情节线管理。触发方式:/story-long-write、/写长篇、「帮我开书」「写大纲」「日更」「续写」「继续写」「修改第X章」「回炉」「重写第X章」。Parallel Deep ResearchONLY use when user explicitly says 'deep research', 'exhaustive', 'comprehensive report', or 'thorough investigation'. Slower and more expensive than parallel-web-search. For normal research/lookup requests, use parallel-web-search instead. Supports multi-turn: pass --previous-interaction-id from a prior research or enrichment to continue with context.LangfuseInteract with Langfuse and access its documentation: tracing, monitoring, creating datasets, running experiments, and evaluating AI applications. Use when needing to (1) query or modify Langfuse data, (2) look up Langfuse documentation, concepts, integration guides, a feature or SDK usage, or (3) do any AI engineering task (AI observability, prompt engineering/management, evaluation and evaluator management, experimentation, dataset management, evaluation-driven CI/CD, feedback collection). Invoke it for tasks in this scope even when Langfuse is not configured or explicitly mentioned.
Комментарии
Войдите, чтобы оставить комментарий.
Комментариев пока нет.