
Emelia ๐ธ๐ป
@thisismissem@hachyderm.io
I love the chaotic energy of this:
https://hollo.social/@hongminhee/0197c02c-cbe2-7df2-a5f8-bd06e1a07490
@botkit@hollo.social ยท 3 following ยท 168 followers
A framework for creating ActivityPub bots. Powered by
@fedify.
@thisismissem@hachyderm.io
I love the chaotic energy of this:
https://hollo.social/@hongminhee/0197c02c-cbe2-7df2-a5f8-bd06e1a07490
@hongminhee@hollo.social ยท Reply to ๆดช ๆฐๆ (Hong Minhee)'s post
Testing out BotKit's new poll functionality with this emoji OTP demo. Enter your fediverse handle, get a poll in your DMs, vote for the right emojis, and you're authenticated. Shows how social protocols can power real-world auth flows.
@hongminhee@hollo.social
I'm currently experimenting with a poll creation feature for @botkit. If this experiment pans out, the feature will likely be included in the next release, BotKit 0.3.0. So far, so good. Each vote will trigger a Bot.onVote
event in real-time. This could open up a lot of interesting possibilities, like a bot that uses emoji selection for one-time authentication.
@botkit@hollo.social
We're pleased to announce that #Node.js support has been merged and will be available in #BotKit 0.3.0.
Now you can build your #ActivityPub bots with both #Deno and Node.js, giving you more flexibility in choosing your preferred runtime environment.
Stay tuned for BotKit 0.3.0!
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
BotKit 0.2.0ใใชใชใผในใใพใใ๏ผBotKitใๅใใฆ็ฅใๆนใฎใใใซ็ฐกๅใซ่ชฌๆใใใจใBotKitใฏTypeScriptใง้็บใใใในใฟใณใใขใญใณใฎActivityPubใใใใใฌใผใ ใฏใผใฏใงใใMastodonใMisskeyใชใฉใใพใใพใชใใงใใฃใใผใน๏ผ#fediverse๏ผใฎใใฉใใใใฉใผใ ใจ้ฃๆบใงใใๆขๅญใใฉใใใใฉใผใ ใฎๅถ็ดใชใใซ่ช็ฑใซใใใใไฝๆใงใใพใใ
ใใฎใชใชใผในใฏใใใงใใฃใใผในใซใใใใใใ้็บใใใ็ฐกๅใงๅผทๅใซใใใใใฎๆ ใฎ้่ฆใชไธๆญฉใงใใใใณใใฅใใใฃใใ่ฆๆใฎใใฃใๆฉ่ฝใๅคๆฐๅฐๅ ฅใใฆใใพใใ
BotKitใฎ้็บใซใใใฆใ็งใใกใฏๅธธใซใใใใใใ่กจ็พๅ่ฑใใงใคใณใฟใฉใฏใใฃใใซใใใใจใซ็ฆ็นใๅฝใฆใฆใใพใใใใใผใธใงใณ0.2.0ใงใฏใใใงใใฃใใผในใฎ็คพไผ็ๅด้ขใใใใใซๅใๅ ฅใใใใจใงใใใใซไธๆญฉๅ้ฒใใพใใใ
ๆใ่ฆๆใฎๅคใใฃใๆฉ่ฝใฎไธใคใใซในใฟใ ็ตตๆๅญใฎใตใใผใใงใใใใใซใใใใใใใฏ็ฌ่ชใฎ่ฆ่ฆ่ฆ็ด ใงใกใใปใผใธใ็ฎ็ซใใใ่ชๅใ ใใฎๅๆงใ่กจ็พใงใใใใใซใชใใพใใใ
// ใใใ็จใฎใซในใฟใ ็ตตๆๅญใๅฎ็พฉ
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// ใกใใปใผใธใซใซในใฟใ ็ตตๆๅญใไฝฟ็จ
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)}ใฏใFedify ${customEmoji(emojis.fedify)}ใซใใฃใฆๆฏใใใใฆใใพใ`
);
ใใฎๆฐใใAPIใงใฏใๆฌกใฎใใจใๅฏ่ฝใซใชใใพใใใ
Bot.addCustomEmojis()
ใงใใใใซใซในใฟใ ็ตตๆๅญใ่ฟฝๅ customEmoji()
้ขๆฐใงใกใใปใผใธใซ็ตตๆๅญใๅซใใEmoji
ใชใใธใงใฏใใtext
ใฟใฐใใณใใฌใผใใงไฝฟ็จใใใณใใฅใใฑใผใทใงใณใฏๅใซใกใใปใผใธใๆ็จฟใใใ ใใงใฏใใใพใใใไปใฎไบบใฎใกใใปใผใธใซๅๅฟใใใใจใ้่ฆใงใใๆฐใใใชใขใฏใทใงใณใทในใใ ใฏใใใใใจใใฉใญใฏใผใฎ้ใซ่ช็ถใชไบคๆตใใคใณใใไฝใๅบใใพใใ
// ๆจๆบใฎUnicode็ตตๆๅญใงใกใใปใผใธใซใชใขใฏใทใงใณ
await message.react(emoji`๐`);
// ใพใใฏๅฎ็พฉใใใซในใฟใ ็ตตๆๅญใงใชใขใฏใทใงใณ
await message.react(emojis.botkit);
// ใชใขใฏใทใงใณใ่ช่ญใใฆๅฟ็ญใใใใใใไฝๆ
bot.onReact = async (session, reaction) => {
await session.publish(
text`${reaction.actor}ใใใ็งใฎใกใใปใผใธใซ${reaction.emoji}ใงใชใขใฏใทใงใณใใฆใใใฆใใใใจใใใใใพใ๏ผ`,
{ visibility: "direct" }
);
};
ใใฎๆฉ่ฝใซใใใใใใใฏๆฌกใฎใใจใใงใใใใใซใชใใพใใใ
Message.react()
ใไฝฟ็จใใฆUnicode็ตตๆๅญใงใกใใปใผใธใซใชใขใฏใทใงใณBot.onReact
ใจBot.onUnreact
ใใณใใฉใผใงใชใขใฏใทใงใณใคใใณใใๅฆ็่ญฐ่ซใงใฏใไปใฎไบบใ่จใฃใใใจใๅ็ งใใๅฟ ่ฆใใใฐใใฐใใใพใใๆฐใใๅผ็จๆฉ่ฝใซใใใใใ็ตๆๅใฎใใไผ่ฉฑในใฌใใใไฝๆใงใใพใใ
// ใใใใฎๆ็จฟใงไปใฎใกใใปใผใธใๅผ็จ
await session.publish(
text`ใใฎ่ๅณๆทฑใ่ฆ็นใซใคใใฆ็ญใใพใ...`,
{ quoteTarget: originalMessage }
);
// ใฆใผใถใผใใใใใฎใกใใปใผใธใๅผ็จใใๅ ดๅใฎๅฆ็
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`${quoteMessage.actor}ใใใ็งใฎ่ใใๅ
ฑๆใใฆใใใฆใใใใจใใใใใพใ๏ผ`,
{ visibility: "direct" }
);
};
ๅผ็จๆฉ่ฝใซใใใใใใใฏๆฌกใฎใใจใใงใใใใใซใชใใพใใใ
quoteTarget
ใชใใทใงใณใงใกใใปใผใธใๅผ็จMessage.quoteTarget
ใ้ใใฆๅผ็จใใใใกใใปใผใธใซใขใฏใปในBot.onQuote
ใคใใณใใใณใใฉใผใงๅผ็จใคใใณใใๅฆ็ใณใใฅใใฑใผใทใงใณใซใฏ่ฆ่ฆ็่ฆ็ด ใ้่ฆใชใใใใใใใฎ่กจ็พๆนๆณใๆนๅใใพใใใ
ใใงใใฃใใผในใงใฎๆดปๅใไผๆญใใๆนๆณใๆนๅใใใพใใใ
ใใใใฎๆนๅใซใใใๆงใ ใชใใงใใฃใใผในใใฉใใใใฉใผใ ใงใฎใใใใฎ็ธไบไฝ็จใไธ่ฒซๆงใจไฟก้ ผๆงใๆใคใใใซใชใใพใใ
ใใใใฎๆฐๆฉ่ฝใไฝ้จใใฆใฟใใใงใใ๏ผBotKit 0.2.0ใฏJSRใงๅฉ็จๅฏ่ฝใงใ็ฐกๅใชใณใใณใใงใคใณในใใผใซใงใใพใใ
deno add jsr:@fedify/botkit@0.2.0
BotKitใฏTemporal API๏ผJavaScriptใงใฏใพใ ่ฉฆ้จ็ใชๆฉ่ฝ๏ผใไฝฟ็จใใใใใdeno.jsonใงใใใๆๅนใซใใๅฟ ่ฆใใใใพใใ
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
ใใใใฎ็ฐกๅใชในใใใใงใๆๆฐๆฉ่ฝใไฝฟใฃใฆใใงใใฃใใผในใใใใไฝๆใพใใฏใขใใใฐใฌใผใใใๆบๅใๆดใใพใใใ
#BotKit 0.2.0ใฏใใใงใใฃใใผในใใใ้็บใใขใฏใปในใใใใใๅผทๅใใคๆฅฝใใใใฎใซใใใใใฎ็งใใกใฎ็ถ็ถ็ใชๅใ็ตใฟใ็คบใใฆใใพใใใใใใฎๆฐๆฉ่ฝใใ็ใใใฎใใใใใใงใใฃใใผในใณใใฅใใใฃใงใใ้ญ ๅ็ใงใคใณใฟใฉใฏใใฃใใชใกใณใใผใซใใใฎใซๅฝน็ซใคใจไฟกใใฆใใพใใ
ๅฎๅ จใชใใญใฅใกใณใใจ่ฉณ็ดฐใชไพใซใคใใฆใฏใ็งใใกใฎใใญใฅใกใณใใตใคใใใ่ฆงใใ ใใใ
ใใฃใผใใใใฏใๆฉ่ฝใชใฏใจในใใใณใผใ่ฒข็ฎใ้ใใฆใใฎใชใชใผในใซ่ฒข็ฎใใฆใใ ใใฃใใในใฆใฎๆนใ ใซๆ่ฌใใพใใBotKitใณใใฅใใใฃใฏๆ้ทใ็ถใใฆใใใ็ใใใไฝๆใใใใฎใๆฅฝใใฟใซใใฆใใพใ๏ผ
BotKitใฏใActivityPubใตใผใใผใขใใชใฑใผใทใงใณใไฝๆใใใใใฎไฝใฌใใซใใฌใผใ ใฏใผใฏFedifyใซใใฃใฆๆฏใใใใฆใใพใใ
#fedidev #ใใงใใฃใใผใน #ใซในใฟใ ็ตตๆๅญ #็ตตๆๅญใชใขใฏใทใงใณ #็ตตๆๅญๅๅฟ #ๅผ็จ
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
BotKit 0.2.0 ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค! BotKit์ ์ฒ์ ์ ํ์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์๊ฐํ์๋ฉด, BotKit์ TypeScript๋ก ๊ฐ๋ฐ๋ ๋ ๋ฆฝํ #ActivityPub ๋ด ํ๋ ์์ํฌ์ ๋๋ค. Mastodon, Misskey ๋ฑ ๋ค์ํ #์ฐํฉ์ฐ์ฃผ(#fediverse) ํ๋ซํผ๊ณผ ์ํธ์์ฉํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ํ๋ซํผ์ ์ ์ฝ์์ ๋ฒ์ด๋ ์์ ๋กญ๊ฒ ๋ด์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฒ ๋ฆด๋ฆฌ์ค๋ ์ฐํฉ์ฐ์ฃผ ๋ด ๊ฐ๋ฐ์ ๋ ์ฝ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ฌ์ ์์ ์ค์ํ ๋ฐ๊ฑธ์์ ๋๋ค. ์ปค๋ฎค๋ํฐ์์ ์์ฒญํด ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์๋กญ๊ฒ ์ ๋ณด์ ๋๋ค.
BotKit์ ๊ฐ๋ฐํ๋ฉด์ ์ฐ๋ฆฌ๋ ํญ์ ๋ด์ด ๋ ํํ๋ ฅ ์๊ณ ์ํธ์์ฉ์ด ํ๋ถํ๋๋ก ๋ง๋๋ ๋ฐ ์ง์คํด ์์ต๋๋ค. 0.2.0 ๋ฒ์ ์์๋ ์ฐํฉ์ฐ์ฃผ์ ์ฌํ์ ์ธก๋ฉด์ ๋ด์ ์ ๋ชฉ์์ผ ํ ๋จ๊ณ ๋ ๋ฐ์ ์์ผฐ์ต๋๋ค.
๊ฐ์ฅ ๋ง์ด ์์ฒญ๋ฐ์๋ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ #์ปค์คํ _์๋ชจ์ง ์ง์์ ๋๋ค. ์ด์ ๋ด์ ๋ ํนํ ์๊ฐ์ ์์๋ก ๋ฉ์์ง๋ฅผ ๋๋ณด์ด๊ฒ ํ๋ฉฐ ์์ ๋ง์ ๊ฐ์ฑ์ ํํํ ์ ์์ต๋๋ค.
// ๋ด์ ์ปค์คํ
์๋ชจ์ง ์ ์ํ๊ธฐ
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// ๋ฉ์์ง์ ์ปค์คํ
์๋ชจ์ง ์ฌ์ฉํ๊ธฐ
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)}์ Fedify ${customEmoji(emojis.fedify)}์ ์ง์์ ๋ฐ์ต๋๋ค`
);
์ด ์๋ก์ด API๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Bot.addCustomEmojis()
๋ก ๋ด์ ์ปค์คํ
์๋ชจ์ง ์ถ๊ฐํ๊ธฐcustomEmoji()
ํจ์๋ก ๋ฉ์์ง์ ์๋ชจ์ง ํฌํจํ๊ธฐEmoji
๊ฐ์ฒด๋ฅผ text
ํ๊ทธ ํ
ํ๋ฆฟ์์ ์ฌ์ฉํ๊ธฐ์ํต์ ๋จ์ํ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ๊ฒ๋ง์ด ์๋๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋ฉ์์ง์ ๋ฐ์ํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ์๋ก์ด ๋ฐ์ ์์คํ ์ ๋ด๊ณผ ํ๋ก์ ์ฌ์ด์ ์์ฐ์ค๋ฌ์ด ์ํธ์์ฉ ์ง์ ์ ๋ง๋ค์ด ์ค๋๋ค.
// ํ์ค ์ ๋์ฝ๋ ์๋ชจ์ง๋ก ๋ฉ์์ง์ ๋ฐ์ํ๊ธฐ
await message.react(emoji`๐`);
// ๋๋ ์ ์ํ ์ปค์คํ
์๋ชจ์ง๋ก ๋ฐ์ํ๊ธฐ
await message.react(emojis.botkit);
// ๋ฐ์์ ์ธ์ํ๊ณ ์๋ตํ๋ ๋ด ๋ง๋ค๊ธฐ
bot.onReact = async (session, reaction) => {
await session.publish(
text`${reaction.actor}๋, ์ ๋ฉ์์ง์ ${reaction.emoji} ๋ฐ์์ ๋จ๊ฒจ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!`,
{ visibility: "direct" }
);
};
์ด ๊ธฐ๋ฅ์ ํตํด ๋ด์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
Message.react()
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋์ฝ๋ ์๋ชจ์ง๋ก ๋ฉ์์ง์ ๋ฐ์ํ๊ธฐBot.onReact
์ Bot.onUnreact
ํธ๋ค๋ฌ๋ก ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐํ ๋ก ์์๋ ์ข ์ข ๋ค๋ฅธ ์ฌ๋์ด ๋งํ ๋ด์ฉ์ ์ฐธ์กฐํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ก์ด #์ธ์ฉ ๊ธฐ๋ฅ์ ๋ ์์ง๋ ฅ ์๋ ๋ํ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
// ๋ด์ ๊ฒ์๋ฌผ์์ ๋ค๋ฅธ ๋ฉ์์ง ์ธ์ฉํ๊ธฐ
await session.publish(
text`์ด ํฅ๋ฏธ๋ก์ด ๊ด์ ์ ๋ํ ๋ต๋ณ์
๋๋ค...`,
{ quoteTarget: originalMessage }
);
// ์ฌ์ฉ์๊ฐ ๋ด์ ๋ฉ์์ง๋ฅผ ์ธ์ฉํ ๋ ์ฒ๋ฆฌํ๊ธฐ
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`${quoteMessage.actor}๋, ์ ์๊ฐ์ ๊ณต์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!`,
{ visibility: "direct" }
);
};
์ธ์ฉ ๊ธฐ๋ฅ์ ํตํด ๋ด์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
quoteTarget
์ต์
์ผ๋ก ๋ฉ์์ง ์ธ์ฉํ๊ธฐMessage.quoteTarget
์ ํตํด ์ธ์ฉ๋ ๋ฉ์์ง์ ์ ๊ทผํ๊ธฐBot.onQuote
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ธ์ฉ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ์ํต์ ์๊ฐ์ ์ธ ์์๋ ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋ด์ ํํ ๋ฐฉ์์ ๊ฐ์ ํ์ต๋๋ค.
์ฐํฉ์ฐ์ฃผ์์ ์กํฐ๋นํฐ๊ฐ ์ ํ๋๋ ๋ฐฉ์๋ ๊ฐ์ ํ์ต๋๋ค.
์ด๋ฌํ ๊ฐ์ ์ฌํญ์ ๋ค์ํ ์ฐํฉ์ฐ์ฃผ ํ๋ซํผ์์ ๋ด์ ์ํธ์์ฉ์ด ์ผ๊ด๋๊ณ ์์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฒฝํํด ๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? BotKit 0.2.0์ JSR์์ ๋ฐ์ ์ ์์ผ๋ฉฐ ๊ฐ๋จํ ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์์ต๋๋ค.
deno add jsr:@fedify/botkit@0.2.0
BotKit์ Temporal API(JavaScript์์ ์์ง ์๋ฒ์ ์ธ ๊ธฐ๋ฅ)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก deno.json์์ ์ด๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
์ด ๊ฐ๋จํ ๋จ๊ณ๋ฅผ ํตํด ์ต์ ๊ธฐ๋ฅ์ผ๋ก ์ฐํฉ์ฐ์ฃผ ๋ด์ ๋ง๋ค๊ฑฐ๋ ์ ๊ทธ๋ ์ด๋ํ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.
BotKit 0.2.0์ ์ฐํฉ์ฐ์ฃผ ๋ด ๊ฐ๋ฐ์ ์ ๊ทผํ๊ธฐ ์ฝ๊ณ , ๊ฐ๋ ฅํ๋ฉฐ, ์ฆ๊ฒ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ฐ๋ฆฌ์ ์ง์์ ์ธ ๋ ธ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ด ์ฌ๋ฌ๋ถ์ ๋ด์ด ์ฐํฉ์ฐ์ฃผ ์ปค๋ฎค๋ํฐ์์ ๋ ๋งค๋ ฅ์ ์ด๊ณ ์ํธ์์ฉ์ด ํ๋ถํ ๊ตฌ์ฑ์์ด ๋๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ ์ฒด ๋ฌธ์์ ๋ ๋ง์ ์์ ๋ ์ ํฌ ๋ฌธ์ ์ฌ์ดํธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
ํผ๋๋ฐฑ, ๊ธฐ๋ฅ ์์ฒญ, ์ฝ๋ ๊ธฐ์ฌ๋ฅผ ํตํด ์ด๋ฒ ๋ฆด๋ฆฌ์ค์ ๋์์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. BotKit ์ปค๋ฎค๋ํฐ๋ ๊ณ์ ์ฑ์ฅํ๊ณ ์์ผ๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ๋ง๋ค์ด๋ผ ์ํ๋ค์ ๊ธฐ๋ํฉ๋๋ค!
BotKit์ ActivityPub ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ ํ์ ๋ ๋ฒจ ํ๋ ์์ํฌ์ธ Fedify์ ์ง์์ ๋ฐ์ต๋๋ค.
#fedidev #์ปค๋ชจ์ง #์ปค์คํ _์ด๋ชจ์ง #์๋ชจ์ง_๋ฐ์ #์ด๋ชจ์ง_๋ฐ์ #์๋ชจ์ง_๋ฆฌ์ก์ #์ด๋ชจ์ง_๋ฆฌ์ก์
@botkit@hollo.social
We're pleased to announce the release of BotKit 0.2.0! For those new to our project, #BotKit is a #TypeScript framework for creating standalone #ActivityPub bots that can interact with Mastodon, Misskey, and other #fediverse platforms without the constraints of these existing platforms.
This release marks an important step in our journey to make fediverse bot development more accessible and powerful, introducing several features that our community has been requesting.
In building BotKit, we've always focused on making bots more expressive and interactive. With version 0.2.0, we're taking this to the next level by bringing the social aspects of the fediverse to your bots.
One of the most requested features has been #custom_emoji support. Now your bots can truly express their personality with unique visuals that make their messages stand out.
// Define custom emojis for your bot
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// Use these custom emojis in your messages
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)} is powered by Fedify ${customEmoji(emojis.fedify)}`
);
With this new API, you can:
Bot.addCustomEmojis()
customEmoji()
functiontext
tagged template with Fedify Emoji
objectsCommunication isn't just about posting messagesโit's also about responding to others. The new reaction system creates natural interaction points between your bot and its followers:
// React to a message with a standard Unicode emoji
await message.react(emoji`๐`);
// Or use one of your custom emojis as a reaction
await message.react(emojis.botkit);
// Create a responsive bot that acknowledges reactions
bot.onReact = async (session, reaction) => {
await session.publish(
text`Thanks for reacting with ${reaction.emoji} to my message, ${reaction.actor}!`,
{ visibility: "direct" }
);
};
This feature allows your bot to:
Message.react()
Bot.onReact
and Bot.onUnreact
handlersDiscussions often involve referencing what others have said. Our new #quote support enables more cohesive conversation threads:
// Quote another message in your bot's post
await session.publish(
text`Responding to this interesting point...`,
{ quoteTarget: originalMessage }
);
// Handle when users quote your bot's messages
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`Thanks for sharing my thoughts, ${quoteMessage.actor}!`,
{ visibility: "direct" }
);
};
With quote support, your bot can:
quoteTarget
optionMessage.quoteTarget
Bot.onQuote
event handlerBecause communication is visual too, we've improved how your bot presents itself:
We've also improved how activities propagate through the fediverse:
These improvements ensure your bot's interactions are consistent and reliable across different fediverse platforms.
Ready to experience these new features? BotKit 0.2.0 is available on JSR and can be installed with a simple command:
deno add jsr:@fedify/botkit@0.2.0
Since BotKit uses the Temporal API (which is still evolving in JavaScript), remember to enable it in your deno.json:
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
With these simple steps, you're ready to create or upgrade your fediverse bot with our latest features.
BotKit 0.2.0 represents our ongoing commitment to making fediverse bot development accessible, powerful, and enjoyable. We believe these new features will help your bots become more engaging and interactive members of the fediverse community.
For complete docs and more examples, visit our docs site.
Thank you to everyone who contributed to this release through feedback, feature requests, and code contributions. The BotKit community continues to grow, and we're excited to see what you'll create!
BotKit is powered by Fedify, a lower-level framework for creating ActivityPub server applications.
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
BotKit 0.2.0ใใชใชใผในใใพใใ๏ผBotKitใๅใใฆ็ฅใๆนใฎใใใซ็ฐกๅใซ่ชฌๆใใใจใBotKitใฏTypeScriptใง้็บใใใในใฟใณใใขใญใณใฎActivityPubใใใใใฌใผใ ใฏใผใฏใงใใMastodonใMisskeyใชใฉใใพใใพใชใใงใใฃใใผใน๏ผ#fediverse๏ผใฎใใฉใใใใฉใผใ ใจ้ฃๆบใงใใๆขๅญใใฉใใใใฉใผใ ใฎๅถ็ดใชใใซ่ช็ฑใซใใใใไฝๆใงใใพใใ
ใใฎใชใชใผในใฏใใใงใใฃใใผในใซใใใใใใ้็บใใใ็ฐกๅใงๅผทๅใซใใใใใฎๆ ใฎ้่ฆใชไธๆญฉใงใใใใณใใฅใใใฃใใ่ฆๆใฎใใฃใๆฉ่ฝใๅคๆฐๅฐๅ ฅใใฆใใพใใ
BotKitใฎ้็บใซใใใฆใ็งใใกใฏๅธธใซใใใใใใ่กจ็พๅ่ฑใใงใคใณใฟใฉใฏใใฃใใซใใใใจใซ็ฆ็นใๅฝใฆใฆใใพใใใใใผใธใงใณ0.2.0ใงใฏใใใงใใฃใใผในใฎ็คพไผ็ๅด้ขใใใใใซๅใๅ ฅใใใใจใงใใใใซไธๆญฉๅ้ฒใใพใใใ
ๆใ่ฆๆใฎๅคใใฃใๆฉ่ฝใฎไธใคใใซในใฟใ ็ตตๆๅญใฎใตใใผใใงใใใใใซใใใใใใใฏ็ฌ่ชใฎ่ฆ่ฆ่ฆ็ด ใงใกใใปใผใธใ็ฎ็ซใใใ่ชๅใ ใใฎๅๆงใ่กจ็พใงใใใใใซใชใใพใใใ
// ใใใ็จใฎใซในใฟใ ็ตตๆๅญใๅฎ็พฉ
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// ใกใใปใผใธใซใซในใฟใ ็ตตๆๅญใไฝฟ็จ
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)}ใฏใFedify ${customEmoji(emojis.fedify)}ใซใใฃใฆๆฏใใใใฆใใพใ`
);
ใใฎๆฐใใAPIใงใฏใๆฌกใฎใใจใๅฏ่ฝใซใชใใพใใใ
Bot.addCustomEmojis()
ใงใใใใซใซในใฟใ ็ตตๆๅญใ่ฟฝๅ customEmoji()
้ขๆฐใงใกใใปใผใธใซ็ตตๆๅญใๅซใใEmoji
ใชใใธใงใฏใใtext
ใฟใฐใใณใใฌใผใใงไฝฟ็จใใใณใใฅใใฑใผใทใงใณใฏๅใซใกใใปใผใธใๆ็จฟใใใ ใใงใฏใใใพใใใไปใฎไบบใฎใกใใปใผใธใซๅๅฟใใใใจใ้่ฆใงใใๆฐใใใชใขใฏใทใงใณใทในใใ ใฏใใใใใจใใฉใญใฏใผใฎ้ใซ่ช็ถใชไบคๆตใใคใณใใไฝใๅบใใพใใ
// ๆจๆบใฎUnicode็ตตๆๅญใงใกใใปใผใธใซใชใขใฏใทใงใณ
await message.react(emoji`๐`);
// ใพใใฏๅฎ็พฉใใใซในใฟใ ็ตตๆๅญใงใชใขใฏใทใงใณ
await message.react(emojis.botkit);
// ใชใขใฏใทใงใณใ่ช่ญใใฆๅฟ็ญใใใใใใไฝๆ
bot.onReact = async (session, reaction) => {
await session.publish(
text`${reaction.actor}ใใใ็งใฎใกใใปใผใธใซ${reaction.emoji}ใงใชใขใฏใทใงใณใใฆใใใฆใใใใจใใใใใพใ๏ผ`,
{ visibility: "direct" }
);
};
ใใฎๆฉ่ฝใซใใใใใใใฏๆฌกใฎใใจใใงใใใใใซใชใใพใใใ
Message.react()
ใไฝฟ็จใใฆUnicode็ตตๆๅญใงใกใใปใผใธใซใชใขใฏใทใงใณBot.onReact
ใจBot.onUnreact
ใใณใใฉใผใงใชใขใฏใทใงใณใคใใณใใๅฆ็่ญฐ่ซใงใฏใไปใฎไบบใ่จใฃใใใจใๅ็ งใใๅฟ ่ฆใใใฐใใฐใใใพใใๆฐใใๅผ็จๆฉ่ฝใซใใใใใ็ตๆๅใฎใใไผ่ฉฑในใฌใใใไฝๆใงใใพใใ
// ใใใใฎๆ็จฟใงไปใฎใกใใปใผใธใๅผ็จ
await session.publish(
text`ใใฎ่ๅณๆทฑใ่ฆ็นใซใคใใฆ็ญใใพใ...`,
{ quoteTarget: originalMessage }
);
// ใฆใผใถใผใใใใใฎใกใใปใผใธใๅผ็จใใๅ ดๅใฎๅฆ็
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`${quoteMessage.actor}ใใใ็งใฎ่ใใๅ
ฑๆใใฆใใใฆใใใใจใใใใใพใ๏ผ`,
{ visibility: "direct" }
);
};
ๅผ็จๆฉ่ฝใซใใใใใใใฏๆฌกใฎใใจใใงใใใใใซใชใใพใใใ
quoteTarget
ใชใใทใงใณใงใกใใปใผใธใๅผ็จMessage.quoteTarget
ใ้ใใฆๅผ็จใใใใกใใปใผใธใซใขใฏใปในBot.onQuote
ใคใใณใใใณใใฉใผใงๅผ็จใคใใณใใๅฆ็ใณใใฅใใฑใผใทใงใณใซใฏ่ฆ่ฆ็่ฆ็ด ใ้่ฆใชใใใใใใใฎ่กจ็พๆนๆณใๆนๅใใพใใใ
ใใงใใฃใใผในใงใฎๆดปๅใไผๆญใใๆนๆณใๆนๅใใใพใใใ
ใใใใฎๆนๅใซใใใๆงใ ใชใใงใใฃใใผในใใฉใใใใฉใผใ ใงใฎใใใใฎ็ธไบไฝ็จใไธ่ฒซๆงใจไฟก้ ผๆงใๆใคใใใซใชใใพใใ
ใใใใฎๆฐๆฉ่ฝใไฝ้จใใฆใฟใใใงใใ๏ผBotKit 0.2.0ใฏJSRใงๅฉ็จๅฏ่ฝใงใ็ฐกๅใชใณใใณใใงใคใณในใใผใซใงใใพใใ
deno add jsr:@fedify/botkit@0.2.0
BotKitใฏTemporal API๏ผJavaScriptใงใฏใพใ ่ฉฆ้จ็ใชๆฉ่ฝ๏ผใไฝฟ็จใใใใใdeno.jsonใงใใใๆๅนใซใใๅฟ ่ฆใใใใพใใ
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
ใใใใฎ็ฐกๅใชในใใใใงใๆๆฐๆฉ่ฝใไฝฟใฃใฆใใงใใฃใใผในใใใใไฝๆใพใใฏใขใใใฐใฌใผใใใๆบๅใๆดใใพใใใ
#BotKit 0.2.0ใฏใใใงใใฃใใผในใใใ้็บใใขใฏใปในใใใใใๅผทๅใใคๆฅฝใใใใฎใซใใใใใฎ็งใใกใฎ็ถ็ถ็ใชๅใ็ตใฟใ็คบใใฆใใพใใใใใใฎๆฐๆฉ่ฝใใ็ใใใฎใใใใใใงใใฃใใผในใณใใฅใใใฃใงใใ้ญ ๅ็ใงใคใณใฟใฉใฏใใฃใใชใกใณใใผใซใใใฎใซๅฝน็ซใคใจไฟกใใฆใใพใใ
ๅฎๅ จใชใใญใฅใกใณใใจ่ฉณ็ดฐใชไพใซใคใใฆใฏใ็งใใกใฎใใญใฅใกใณใใตใคใใใ่ฆงใใ ใใใ
ใใฃใผใใใใฏใๆฉ่ฝใชใฏใจในใใใณใผใ่ฒข็ฎใ้ใใฆใใฎใชใชใผในใซ่ฒข็ฎใใฆใใ ใใฃใใในใฆใฎๆนใ ใซๆ่ฌใใพใใBotKitใณใใฅใใใฃใฏๆ้ทใ็ถใใฆใใใ็ใใใไฝๆใใใใฎใๆฅฝใใฟใซใใฆใใพใ๏ผ
BotKitใฏใActivityPubใตใผใใผใขใใชใฑใผใทใงใณใไฝๆใใใใใฎไฝใฌใใซใใฌใผใ ใฏใผใฏFedifyใซใใฃใฆๆฏใใใใฆใใพใใ
#fedidev #ใใงใใฃใใผใน #ใซในใฟใ ็ตตๆๅญ #็ตตๆๅญใชใขใฏใทใงใณ #็ตตๆๅญๅๅฟ #ๅผ็จ
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
BotKit 0.2.0 ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค! BotKit์ ์ฒ์ ์ ํ์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์๊ฐํ์๋ฉด, BotKit์ TypeScript๋ก ๊ฐ๋ฐ๋ ๋ ๋ฆฝํ #ActivityPub ๋ด ํ๋ ์์ํฌ์ ๋๋ค. Mastodon, Misskey ๋ฑ ๋ค์ํ #์ฐํฉ์ฐ์ฃผ(#fediverse) ํ๋ซํผ๊ณผ ์ํธ์์ฉํ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ํ๋ซํผ์ ์ ์ฝ์์ ๋ฒ์ด๋ ์์ ๋กญ๊ฒ ๋ด์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฒ ๋ฆด๋ฆฌ์ค๋ ์ฐํฉ์ฐ์ฃผ ๋ด ๊ฐ๋ฐ์ ๋ ์ฝ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ฌ์ ์์ ์ค์ํ ๋ฐ๊ฑธ์์ ๋๋ค. ์ปค๋ฎค๋ํฐ์์ ์์ฒญํด ์๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์๋กญ๊ฒ ์ ๋ณด์ ๋๋ค.
BotKit์ ๊ฐ๋ฐํ๋ฉด์ ์ฐ๋ฆฌ๋ ํญ์ ๋ด์ด ๋ ํํ๋ ฅ ์๊ณ ์ํธ์์ฉ์ด ํ๋ถํ๋๋ก ๋ง๋๋ ๋ฐ ์ง์คํด ์์ต๋๋ค. 0.2.0 ๋ฒ์ ์์๋ ์ฐํฉ์ฐ์ฃผ์ ์ฌํ์ ์ธก๋ฉด์ ๋ด์ ์ ๋ชฉ์์ผ ํ ๋จ๊ณ ๋ ๋ฐ์ ์์ผฐ์ต๋๋ค.
๊ฐ์ฅ ๋ง์ด ์์ฒญ๋ฐ์๋ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ #์ปค์คํ _์๋ชจ์ง ์ง์์ ๋๋ค. ์ด์ ๋ด์ ๋ ํนํ ์๊ฐ์ ์์๋ก ๋ฉ์์ง๋ฅผ ๋๋ณด์ด๊ฒ ํ๋ฉฐ ์์ ๋ง์ ๊ฐ์ฑ์ ํํํ ์ ์์ต๋๋ค.
// ๋ด์ ์ปค์คํ
์๋ชจ์ง ์ ์ํ๊ธฐ
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// ๋ฉ์์ง์ ์ปค์คํ
์๋ชจ์ง ์ฌ์ฉํ๊ธฐ
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)}์ Fedify ${customEmoji(emojis.fedify)}์ ์ง์์ ๋ฐ์ต๋๋ค`
);
์ด ์๋ก์ด API๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Bot.addCustomEmojis()
๋ก ๋ด์ ์ปค์คํ
์๋ชจ์ง ์ถ๊ฐํ๊ธฐcustomEmoji()
ํจ์๋ก ๋ฉ์์ง์ ์๋ชจ์ง ํฌํจํ๊ธฐEmoji
๊ฐ์ฒด๋ฅผ text
ํ๊ทธ ํ
ํ๋ฆฟ์์ ์ฌ์ฉํ๊ธฐ์ํต์ ๋จ์ํ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ๊ฒ๋ง์ด ์๋๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ๋ฉ์์ง์ ๋ฐ์ํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ์๋ก์ด ๋ฐ์ ์์คํ ์ ๋ด๊ณผ ํ๋ก์ ์ฌ์ด์ ์์ฐ์ค๋ฌ์ด ์ํธ์์ฉ ์ง์ ์ ๋ง๋ค์ด ์ค๋๋ค.
// ํ์ค ์ ๋์ฝ๋ ์๋ชจ์ง๋ก ๋ฉ์์ง์ ๋ฐ์ํ๊ธฐ
await message.react(emoji`๐`);
// ๋๋ ์ ์ํ ์ปค์คํ
์๋ชจ์ง๋ก ๋ฐ์ํ๊ธฐ
await message.react(emojis.botkit);
// ๋ฐ์์ ์ธ์ํ๊ณ ์๋ตํ๋ ๋ด ๋ง๋ค๊ธฐ
bot.onReact = async (session, reaction) => {
await session.publish(
text`${reaction.actor}๋, ์ ๋ฉ์์ง์ ${reaction.emoji} ๋ฐ์์ ๋จ๊ฒจ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!`,
{ visibility: "direct" }
);
};
์ด ๊ธฐ๋ฅ์ ํตํด ๋ด์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
Message.react()
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋์ฝ๋ ์๋ชจ์ง๋ก ๋ฉ์์ง์ ๋ฐ์ํ๊ธฐBot.onReact
์ Bot.onUnreact
ํธ๋ค๋ฌ๋ก ๋ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐํ ๋ก ์์๋ ์ข ์ข ๋ค๋ฅธ ์ฌ๋์ด ๋งํ ๋ด์ฉ์ ์ฐธ์กฐํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ก์ด #์ธ์ฉ ๊ธฐ๋ฅ์ ๋ ์์ง๋ ฅ ์๋ ๋ํ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
// ๋ด์ ๊ฒ์๋ฌผ์์ ๋ค๋ฅธ ๋ฉ์์ง ์ธ์ฉํ๊ธฐ
await session.publish(
text`์ด ํฅ๋ฏธ๋ก์ด ๊ด์ ์ ๋ํ ๋ต๋ณ์
๋๋ค...`,
{ quoteTarget: originalMessage }
);
// ์ฌ์ฉ์๊ฐ ๋ด์ ๋ฉ์์ง๋ฅผ ์ธ์ฉํ ๋ ์ฒ๋ฆฌํ๊ธฐ
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`${quoteMessage.actor}๋, ์ ์๊ฐ์ ๊ณต์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!`,
{ visibility: "direct" }
);
};
์ธ์ฉ ๊ธฐ๋ฅ์ ํตํด ๋ด์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
quoteTarget
์ต์
์ผ๋ก ๋ฉ์์ง ์ธ์ฉํ๊ธฐMessage.quoteTarget
์ ํตํด ์ธ์ฉ๋ ๋ฉ์์ง์ ์ ๊ทผํ๊ธฐBot.onQuote
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ธ์ฉ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ์ํต์ ์๊ฐ์ ์ธ ์์๋ ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋ด์ ํํ ๋ฐฉ์์ ๊ฐ์ ํ์ต๋๋ค.
์ฐํฉ์ฐ์ฃผ์์ ์กํฐ๋นํฐ๊ฐ ์ ํ๋๋ ๋ฐฉ์๋ ๊ฐ์ ํ์ต๋๋ค.
์ด๋ฌํ ๊ฐ์ ์ฌํญ์ ๋ค์ํ ์ฐํฉ์ฐ์ฃผ ํ๋ซํผ์์ ๋ด์ ์ํธ์์ฉ์ด ์ผ๊ด๋๊ณ ์์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฒฝํํด ๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? BotKit 0.2.0์ JSR์์ ๋ฐ์ ์ ์์ผ๋ฉฐ ๊ฐ๋จํ ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์์ต๋๋ค.
deno add jsr:@fedify/botkit@0.2.0
BotKit์ Temporal API(JavaScript์์ ์์ง ์๋ฒ์ ์ธ ๊ธฐ๋ฅ)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก deno.json์์ ์ด๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
์ด ๊ฐ๋จํ ๋จ๊ณ๋ฅผ ํตํด ์ต์ ๊ธฐ๋ฅ์ผ๋ก ์ฐํฉ์ฐ์ฃผ ๋ด์ ๋ง๋ค๊ฑฐ๋ ์ ๊ทธ๋ ์ด๋ํ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.
BotKit 0.2.0์ ์ฐํฉ์ฐ์ฃผ ๋ด ๊ฐ๋ฐ์ ์ ๊ทผํ๊ธฐ ์ฝ๊ณ , ๊ฐ๋ ฅํ๋ฉฐ, ์ฆ๊ฒ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์ฐ๋ฆฌ์ ์ง์์ ์ธ ๋ ธ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ด ์ฌ๋ฌ๋ถ์ ๋ด์ด ์ฐํฉ์ฐ์ฃผ ์ปค๋ฎค๋ํฐ์์ ๋ ๋งค๋ ฅ์ ์ด๊ณ ์ํธ์์ฉ์ด ํ๋ถํ ๊ตฌ์ฑ์์ด ๋๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ ์ฒด ๋ฌธ์์ ๋ ๋ง์ ์์ ๋ ์ ํฌ ๋ฌธ์ ์ฌ์ดํธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
ํผ๋๋ฐฑ, ๊ธฐ๋ฅ ์์ฒญ, ์ฝ๋ ๊ธฐ์ฌ๋ฅผ ํตํด ์ด๋ฒ ๋ฆด๋ฆฌ์ค์ ๋์์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. BotKit ์ปค๋ฎค๋ํฐ๋ ๊ณ์ ์ฑ์ฅํ๊ณ ์์ผ๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ๋ง๋ค์ด๋ผ ์ํ๋ค์ ๊ธฐ๋ํฉ๋๋ค!
BotKit์ ActivityPub ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ ํ์ ๋ ๋ฒจ ํ๋ ์์ํฌ์ธ Fedify์ ์ง์์ ๋ฐ์ต๋๋ค.
#fedidev #์ปค๋ชจ์ง #์ปค์คํ _์ด๋ชจ์ง #์๋ชจ์ง_๋ฐ์ #์ด๋ชจ์ง_๋ฐ์ #์๋ชจ์ง_๋ฆฌ์ก์ #์ด๋ชจ์ง_๋ฆฌ์ก์
@botkit@hollo.social
We're pleased to announce the release of BotKit 0.2.0! For those new to our project, #BotKit is a #TypeScript framework for creating standalone #ActivityPub bots that can interact with Mastodon, Misskey, and other #fediverse platforms without the constraints of these existing platforms.
This release marks an important step in our journey to make fediverse bot development more accessible and powerful, introducing several features that our community has been requesting.
In building BotKit, we've always focused on making bots more expressive and interactive. With version 0.2.0, we're taking this to the next level by bringing the social aspects of the fediverse to your bots.
One of the most requested features has been #custom_emoji support. Now your bots can truly express their personality with unique visuals that make their messages stand out.
// Define custom emojis for your bot
const emojis = bot.addCustomEmojis({
botkit: {
file: `${import.meta.dirname}/images/botkit.png`,
type: "image/png"
},
fedify: {
url: "https://fedify.dev/logo.png",
type: "image/png"
}
});
// Use these custom emojis in your messages
await session.publish(
text`BotKit ${customEmoji(emojis.botkit)} is powered by Fedify ${customEmoji(emojis.fedify)}`
);
With this new API, you can:
Bot.addCustomEmojis()
customEmoji()
functiontext
tagged template with Fedify Emoji
objectsCommunication isn't just about posting messagesโit's also about responding to others. The new reaction system creates natural interaction points between your bot and its followers:
// React to a message with a standard Unicode emoji
await message.react(emoji`๐`);
// Or use one of your custom emojis as a reaction
await message.react(emojis.botkit);
// Create a responsive bot that acknowledges reactions
bot.onReact = async (session, reaction) => {
await session.publish(
text`Thanks for reacting with ${reaction.emoji} to my message, ${reaction.actor}!`,
{ visibility: "direct" }
);
};
This feature allows your bot to:
Message.react()
Bot.onReact
and Bot.onUnreact
handlersDiscussions often involve referencing what others have said. Our new #quote support enables more cohesive conversation threads:
// Quote another message in your bot's post
await session.publish(
text`Responding to this interesting point...`,
{ quoteTarget: originalMessage }
);
// Handle when users quote your bot's messages
bot.onQuote = async (session, quoteMessage) => {
await session.publish(
text`Thanks for sharing my thoughts, ${quoteMessage.actor}!`,
{ visibility: "direct" }
);
};
With quote support, your bot can:
quoteTarget
optionMessage.quoteTarget
Bot.onQuote
event handlerBecause communication is visual too, we've improved how your bot presents itself:
We've also improved how activities propagate through the fediverse:
These improvements ensure your bot's interactions are consistent and reliable across different fediverse platforms.
Ready to experience these new features? BotKit 0.2.0 is available on JSR and can be installed with a simple command:
deno add jsr:@fedify/botkit@0.2.0
Since BotKit uses the Temporal API (which is still evolving in JavaScript), remember to enable it in your deno.json:
{
"imports": {
"@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
},
"unstable": ["temporal"]
}
With these simple steps, you're ready to create or upgrade your fediverse bot with our latest features.
BotKit 0.2.0 represents our ongoing commitment to making fediverse bot development accessible, powerful, and enjoyable. We believe these new features will help your bots become more engaging and interactive members of the fediverse community.
For complete docs and more examples, visit our docs site.
Thank you to everyone who contributed to this release through feedback, feature requests, and code contributions. The BotKit community continues to grow, and we're excited to see what you'll create!
BotKit is powered by Fedify, a lower-level framework for creating ActivityPub server applications.
@botkit@hollo.social
Coming soon in #BotKit 0.2.0: Native #quote post support!
We're excited to share a preview of the upcoming quoting features in BotKit 0.2.0. This update will make it easier for your bots to engage with quoted content across the fediverse.
The quoting feature set includes:
Bot.onQuote
event handlerMessage.quoteTarget
propertyquoteTarget
option in Session.publish()
and Message.reply()
methodsHere's a quick example of how you can use the quote detection:
bot.onQuote = async (session, quote) => {
// The quote parameter is a Message object representing the post that quoted your bot
await quote.reply(text`Thanks for quoting my post, ${quote.actor}!`);
// You can access the original quoted message
const originalPost = quote.quoteTarget;
console.log(`Original message: ${originalPost?.text}`);
};
And creating quote posts is just as simple:
// Quote in a new post
await session.publish(
text`I'm quoting this interesting message!`,
{ quoteTarget: someMessage }
);
// Or quote in a reply
await message.reply(
text`Interesting point! I'm quoting another relevant post here.`,
{ quoteTarget: anotherMessage }
);
Remember that quoting behavior may vary across different #ActivityPub implementationsโsome platforms like Misskey display quotes prominently, while others like Mastodon might implement them differently.
Want to try these features right now? You can install the development version from JSR:
deno add jsr:@fedify/botkit@0.2.0-dev.90+d6ab4bdc
We're looking forward to seeing how you use these quoting capabilities in your bots!
@esurio1673@c.koliosky.com
Botkit๏ผใชใขใฏใทใงใณใงใใใใใซใชใฃใใฎใญ
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
Continuing our emoji reaction feature announcement, we're also introducing two new event handlersโBot.onReact
and Bot.onUnreact
โthat let your bot respond when users react to posts:
// When someone adds an emoji reaction to a post
bot.onReact = async (session, reaction) => {
// Only respond when the reaction is to your bot's post
if (reaction.message.actor.id?.href === session.actorId.href) {
console.log(`${reaction.actor.preferredUsername} reacted with ${reaction.emoji}`);
// You can respond differently based on the emoji
if (reaction.emoji === "โค๏ธ") {
await session.publish(
text`Thanks for the love, ${reaction.actor}!`,
{ visibility: "direct" }
);
}
}
};
// When someone removes their emoji reaction
bot.onUnreact = async (session, reaction) => {
if (reaction.message.actor.id?.href === session.actorId.href) {
console.log(`${reaction.actor.preferredUsername} removed their ${reaction.emoji} reaction`);
// Optional: respond to reaction removal
await session.publish(
text`I noticed you removed your ${reaction.emoji} reaction, ${reaction.actor}.`,
{ visibility: "direct" }
);
}
};
These event handlers open up interesting interaction possibilitiesโyour bot can now track popular reactions, respond to specific emoji feedback, or create interactive experiences based on reactions.
Want to try these features now? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.86+cdbb52a2
The full documentation for these features will be available when BotKit 0.2.0 is officially released!
@botkit@hollo.social
We're excited to introduce emoji reactions in the upcoming #BotKit 0.2.0 release!
With the new Message.react()
method, your bot can now react to messages using standard Unicode #emojis:
await message.react(emoji`๐`);
#Custom_emoji support is also included, allowing your bot to react with server-specific emojis:
const emojis = bot.addCustomEmojis({
// Use a remote image URL:
yesBlob: {
url: "https://cdn3.emoji.gg/emojis/68238-yesblob.png",
mediaType: "image/png",
},
// Use a local image file:
noBlob: {
file: `${import.meta.dirname}/emojis/no_blob.png`,
mediaType: "image/webp",
},
});
await message.react(emojis.yesBlob);
Reactions can be removed using the AuthorizedReaction.unreact()
method:
const reaction = await message.react(emoji`โค๏ธ`);
await reaction.unreact();
Want to try these features now? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.84+c997c6a6
We're looking forward to seeing how your bots express themselves with this new feature!
@botkit@hollo.social
We're excited to announce that #BotKit 0.2.0 will introduce custom emoji support! This feature allows your bots to express themselves with more personality and engagement.
What's included:
Bot.addCustomEmojis()
customEmoji()
functionSimple example:
// Define custom emojis
const emojis = bot.addCustomEmojis({
botkit: { file: "./botkit.png", type: "image/png" },
fedify: { url: "https://fedify.dev/logo.png", type: "image/png" }
});
// Use in messages
await session.publish(
text`Hello world! ${customEmoji(emojis.botkit)}`
);
Want to try it early? You can install the development version from JSR today:
deno add jsr:@fedify/botkit@0.2.0-dev.82+8a0438e6
@hongminhee@hollo.social
I've been considering what to add in the next version of BotKit (v0.2.0) and wanted to share my current plans. After reviewing feedback and examining the #ActivityPub ecosystem, I've identified three key features that would significantly enhance the framework's capabilities:
Custom emoji support. This would allow bots to use server-defined custom emojis in their messages, making communication more expressive and allowing better integration with instance culture.
Emoji reactions. I plan to implement both sending and receiving emoji reactions to messages. This provides a lightweight interaction model that many users prefer for simple acknowledgments or responses. This would manifest as new event handlers (like Bot.onReaction
) and methods (like Message.react()
).
Quote posts. The ability to reference other posts with commentary is an important discourse feature in the fediverse. Supporting both sending quotes and detecting when bot posts have been quoted would enable more sophisticated conversational patterns.
These additions should make #BotKit more capable while maintaining its simple, developer-friendly API. I expect implementation to involve extending the Message
class and adding new Text
processing capabilities, all while keeping backward compatibility with existing bots. Having built both Hollo and Hackers' Pub, I already have deep familiarity with how various ActivityPub implementations handle these features across the fediverse. I welcome any community feedback on priorities or implementation details before I begin coding.
@parksb@silicon.moe
BotKit์ ์ด์ฉํด ๊ตญ๋ด์ธ ๊ธฐ์ ๋ธ๋ก๊ทธ์ ์ํฐํด์ ์ ๋ก๋ํ๋ 'Tech Blog Bot'์ ๋ง๋ค์๋ค. 1์๊ฐ์ ํ ๋ฒ์ฉ ๊ตฌ๋ ์ค์ธ ๋ธ๋ก๊ทธ๋ค์ ์ ์ํฐํด์ ํ์ธํด ํ์ ๋ฃ๊ณ , 1๋ถ์ ํ๋์ฉ ํ์ ์ํฐํด์ ์ ๋ก๋ํ๋ค. BotKit์ ์ ๋ คํจ์ ์ฒซ ๋ฒ์งธ๋ก ๋๋๊ณ , ํ ์คํธ๋ก ๋๋ ค๋ณธ ๋ด์ด ์คํธ์ง์ ํ๋ ๊ฑธ ๋ณด๋ฉด์ ๋ ๋ฒ์งธ๋ก ๋๋๋ค. https://techblogbot.parksb.xyz/
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
#ใใงใใฃใใผใน๏ผ#fediverse๏ผ็จใฎใใใใไฝใใใใงใใ๏ผ#BotKit by Fedifyใไฝฟใใฐใใใใๆฐ่กใฎใณใผใใงในใฟใณใใขใญใณใฎActivityPubใใใใๆง็ฏใงใใพใ๏ผๅพๆฅใฎMastodonใMisskeyใใใใจใฏ็ฐใชใใBotKitใฏใใฉใใใใฉใผใ ใฎๅถ็ดใชใใซๅฎๅ จใชActivityPubใตใผใใผใไฝๆใงใใพใใ
BotKitใงใงใใใใจ๏ผ
ใใญใฅใกใณใใฏhttps://botkit.fedify.dev/ใง็ขบ่ชใใไปใใใใงใใฃใใผในใใใใฎๆง็ฏใๅงใใพใใใ๏ผ
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
#์ฐํฉ์ฐ์ฃผ(#fediverse)๋ฅผ ์ํ ๋ด์ ๋ง๋ค๊ณ ์ถ์ผ์ ๊ฐ์? #BotKit by Fedify๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ๋ ๋ฆฝํ #ActivityPub ๋ด์ ๊ตฌ์ถํ ์ ์์ต๋๋ค! ์ผ๋ฐ์ ์ธ Mastodon ๋๋ Misskey ๋ด๊ณผ ๋ฌ๋ฆฌ, BotKit์ ํ๋ซํผ ์ ์ฝ ์์ด ์์ ํ ActivityPub ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์์ค๋๋ค.
BotKit์ผ๋ก ํ ์ ์๋ ๊ฒ:
๋ฌธ์๋ https://botkit.fedify.dev/์์ ํ์ธํ์๊ณ ์ง๊ธ ๋ฐ๋ก ์ฐํฉ์ฐ์ฃผ ๋ด์ ๋ง๋ค์ด ๋ณด์ธ์!
@botkit@hollo.social
Want to create a #bot for the #fediverse? #BotKit by @fedify lets you build standalone #ActivityPub bots with just a few lines of code! Unlike traditional Mastodon bots, BotKit helps you create complete ActivityPub servers without platform constraints.
With BotKit, you can:
Check out our documentation at https://botkit.fedify.dev/ and start building your fediverse bot today!
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
#ใใงใใฃใใผใน๏ผ#fediverse๏ผ็จใฎใใใใไฝใใใใงใใ๏ผ#BotKit by Fedifyใไฝฟใใฐใใใใๆฐ่กใฎใณใผใใงในใฟใณใใขใญใณใฎActivityPubใใใใๆง็ฏใงใใพใ๏ผๅพๆฅใฎMastodonใMisskeyใใใใจใฏ็ฐใชใใBotKitใฏใใฉใใใใฉใผใ ใฎๅถ็ดใชใใซๅฎๅ จใชActivityPubใตใผใใผใไฝๆใงใใพใใ
BotKitใงใงใใใใจ๏ผ
ใใญใฅใกใณใใฏhttps://botkit.fedify.dev/ใง็ขบ่ชใใไปใใใใงใใฃใใผในใใใใฎๆง็ฏใๅงใใพใใใ๏ผ
@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post
#์ฐํฉ์ฐ์ฃผ(#fediverse)๋ฅผ ์ํ ๋ด์ ๋ง๋ค๊ณ ์ถ์ผ์ ๊ฐ์? #BotKit by Fedify๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ๋ ๋ฆฝํ #ActivityPub ๋ด์ ๊ตฌ์ถํ ์ ์์ต๋๋ค! ์ผ๋ฐ์ ์ธ Mastodon ๋๋ Misskey ๋ด๊ณผ ๋ฌ๋ฆฌ, BotKit์ ํ๋ซํผ ์ ์ฝ ์์ด ์์ ํ ActivityPub ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋์์ค๋๋ค.
BotKit์ผ๋ก ํ ์ ์๋ ๊ฒ:
๋ฌธ์๋ https://botkit.fedify.dev/์์ ํ์ธํ์๊ณ ์ง๊ธ ๋ฐ๋ก ์ฐํฉ์ฐ์ฃผ ๋ด์ ๋ง๋ค์ด ๋ณด์ธ์!
@botkit@hollo.social
Want to create a #bot for the #fediverse? #BotKit by @fedify lets you build standalone #ActivityPub bots with just a few lines of code! Unlike traditional Mastodon bots, BotKit helps you create complete ActivityPub servers without platform constraints.
With BotKit, you can:
Check out our documentation at https://botkit.fedify.dev/ and start building your fediverse bot today!
@skyfaller@jawns.club ยท Reply to Loren's post
@loren BotKit looks like an interesting approach, but I've never made a bot so I can't evaluate it: https://botkit.fedify.dev/
@fedify@hollo.social ยท Reply to Fedify: an ActivityPub server framework's post
Fedifyใฎ้ข้ฃใใญใธใงใฏใใใ็ดนไปใใใใจๆใใพใใActivityPubใขใใชใฑใผใทใงใณ้็บใใใ็ฐกๅใซใใใใผใซ็พคใงใ๏ผ
Fedify๏ผ@fedify๏ผใฏActivityPubใใใฎไปใฎใใงใใฃใใผในๆจๆบใๆดป็จใใ้ฃๅๅใตใผใใผใขใใชใฑใผใทใงใณใๆง็ฏใใใใใฎTypeScriptใฉใคใใฉใชใงใใActivity Vocabularyใฎๅๅฎๅ จใชใชใใธใงใฏใใWebFingerใฏใฉใคใขใณใใปใตใผใใผใHTTP Signaturesใชใฉใๆไพใใใใคใฉใผใใฌใผใใณใผใใๅๆธใใฆใขใใชใฑใผใทใงใณใญใธใใฏใซ้ไธญใงใใใใใซใใพใใ
Hollo๏ผ@hollo๏ผใฏFedifyใงๅไฝใใใไธไบบๆง็จใใคใฏใญใใญใฐใตใผใใผใงใใๅไบบๅใใซ่จญ่จใใใฆใใพใใใActivityPubใ้ใใฆๅฎๅ จใซ้ฃๅๅใใใฆใใใใใงใใฃใใผในๅ จไฝใฎใฆใผใถใผใจไบคๆตใใใใจใใงใใพใใHolloใฏMastodonไบๆAPIใๅฎ่ฃ ใใฆใใใใใ็ฌ่ชใฎใฆใงใใคใณใฟใผใใงใผในใใชใใฆใใใปใจใใฉใฎMastodonใฏใฉใคใขใณใใจไบๆๆงใใใใพใใ
HolloใฏใพใใๆญฃๅผใชใชใผในๅใฎๆๆฐFedifyๆฉ่ฝใใในใใใๅฎ้จๅ ดใจใใฆใๆดป็จใใใฆใใพใใ
BotKit๏ผ@botkit๏ผใฏ็งใใกใฎๆใๆฐใใใกใณใใผใงใActivityPubใใใใไฝๆใใใใใซ็นๅฅใซ่จญ่จใใใใใฌใผใ ใฏใผใฏใงใใๅพๆฅใฎMastodonใใใใจใฏ็ฐใชใใBotKitใฏใใฉใใใใฉใผใ ๅบๆใฎๅถ้๏ผๆๅญๆฐๅถ้ใชใฉ๏ผใซ็ธใใใชใ็ฌ็ซใใActivityPubใตใผใใผใไฝๆใใพใใ
BotKitใฎAPIใฏๆๅณ็ใซใทใณใใซใซ่จญ่จใใใฆใใใๅไธใฎTypeScriptใใกใคใซใงๅฎๅ จใชใใใใไฝๆใงใใพใ๏ผ
ใใใไธใคใฎใใญใธใงใฏใใฏใในใฆ@fedify-dev GitHubใชใผใฌใใผใผใทใงใณใงใชใผใใณใฝใผในใจใใฆๅ ฌ้ใใใฆใใพใใใใใใ็ฐใชใ็ฎ็ใๆใฃใฆใใพใใใActivityPub้็บใใใ่บซ่ฟใซใใใใงใใฃใใผในใฎใจใณใทในใใ ใๆกๅคงใใใจใใๅ ฑ้ใฎ็ฎๆจใๅ ฑๆใใฆใใพใใ
ใใใใฎใใญใธใงใฏใใ่ฉฆใใฆใฟใใใ้็บใซ่ฒข็ฎใใใใใใใจใซ่ๅณใใใๅ ดๅใฏใไปฅไธใใ่ฆงใใ ใใ๏ผ
#Fedify #ActivityPub #ใใงใใฃใใผใน #fediverse #Hollo #BotKit #fedidev
@fedify@hollo.social ยท Reply to Fedify: an ActivityPub server framework's post
#Fedify ์๋งค ํ๋ก์ ํธ๋ค์ ์๊ฐํด ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค. #ActivityPub ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ด๋ จ ๋๊ตฌ๋ค์ ๋๋ค:
Fedify(@fedify)๋ ActivityPub์ ๋ค๋ฅธ #์ฐํฉ์ฐ์ฃผ(#fediverse) ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ์ฐํฉ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ #TypeScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Activity Vocabulary๋ฅผ ์ํ ํ์ ์์ ํ ๊ฐ์ฒด, WebFinger ํด๋ผ์ด์ธํธ·์๋ฒ, HTTP Signatures ๋ฑ๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ํด์ค๋๋ค.
Hollo(@hollo)๋ Fedify๋ก ๊ตฌ๋๋๋ 1์ธ ์ฌ์ฉ์์ฉ ๋ง์ดํฌ๋ก๋ธ๋ก๊น ์๋ฒ์ ๋๋ค. 1์ธ ์ฌ์ฉ์๋ฅผ ์ํด ์ค๊ณ๋์์ง๋ง, ActivityPub๋ฅผ ํตํด ์์ ํ ์ฐํฉ๋์ด ์ฐํฉ์ฐ์ฃผ ์ ์ฒด์ ์ฌ์ฉ์๋ค๊ณผ ์ํธ์์ฉํ ์ ์์ต๋๋ค. Hollo๋ Mastodon ํธํ API๋ฅผ ๊ตฌํํ์ฌ ์์ฒด ์น ์ธํฐํ์ด์ค ์์ด๋ ๋๋ถ๋ถ์ Mastodon ํด๋ผ์ด์ธํธ์ ํธํ๋ฉ๋๋ค.
Hollo๋ ๋ํ ์ ์ ์ถ์ ์ ์ ์ต์ Fedify ๊ธฐ๋ฅ์ ํ ์คํธํ๋ ์คํ์ฅ์ผ๋ก๋ ํ์ฉ๋๊ณ ์์ต๋๋ค.
BotKit(@botkit)์ ์ ํฌ์ ๊ฐ์ฅ ์๋ก์ด ๊ตฌ์ฑ์์ผ๋ก, ActivityPub ๋ด์ ๋ง๋ค๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ ํต์ ์ธ Mastodon ๋ด๊ณผ ๋ฌ๋ฆฌ, BotKit์ ํ๋ซํผ๋ณ ์ ํ(๊ธ์ ์ ์ ํ ๋ฑ)์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ ๋ฆฝ์ ์ธ ActivityPub ์๋ฒ๋ฅผ ๋ง๋ญ๋๋ค.
BotKit์ API๋ ์๋์ ์ผ๋ก ๋จ์ํ๊ฒ ์ค๊ณ๋์ด ๋จ์ผ TypeScript ํ์ผ๋ก ์์ ํ ๋ด์ ๋ง๋ค ์ ์์ต๋๋ค!
์ธ ํ๋ก์ ํธ ๋ชจ๋ @fedify-dev GitHub ์กฐ์ง์์ ์คํ ์์ค๋ก ๊ณต๊ฐ๋์ด ์์ต๋๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์์ง๋ง, ActivityPub ๊ฐ๋ฐ์ ๋ ์ ๊ทผํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ฐํฉ์ฐ์ฃผ ์ํ๊ณ๋ฅผ ํ์ฅํ๋ค๋ ๊ณตํต๋ ๋ชฉํ๋ฅผ ๊ณต์ ํฉ๋๋ค.
์ด๋ฌํ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํด๋ณด๊ฑฐ๋ ๊ฐ๋ฐ์ ๊ธฐ์ฌํ๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์๋ค๋ฉด, ๋ค์์ ํ์ธํด๋ณด์ธ์:
@fedify@hollo.social
We'd like to introduce the #Fedify project familyโa set of related tools that make building #ActivityPub applications more accessible:
Fedify (@fedify) is a #TypeScript library for building federated server applications powered by ActivityPub and other #fediverse standards. It provides type-safe objects for Activity Vocabulary, WebFinger client/server, HTTP Signatures, and moreโeliminating boilerplate code so you can focus on your application logic.
Hollo (@hollo) is a single-user microblogging server powered by Fedify. While designed for individual users, it's fully federated through ActivityPub, allowing interaction with users across the fediverse. #Hollo implements Mastodon-compatible APIs, making it compatible with most Mastodon clients without needing its own web interface.
Hollo also serves as our testing ground for bleeding-edge Fedify features before they're officially released.
BotKit (@botkit) is our newest family memberโa framework specifically designed for creating ActivityPub bots. Unlike traditional Mastodon bots, #BotKit creates standalone ActivityPub servers that aren't constrained by platform-specific limitations (like character counts).
BotKit's API is intentionally simpleโyou can create a complete bot in a single TypeScript file!
All three projects are open source and hosted under the @fedify-dev GitHub organization. While they serve different purposes, they share common goals: making ActivityPub development more accessible and expanding the fediverse ecosystem.
If you're interested in trying any of these projects or contributing to their development, check out:
@botkit@hollo.social
Are you interested in creating bots for the #fediverse? Meet #BotKit, a #TypeScript framework that makes bot development easier than ever!
Key Features:
True Independence
Simple and Intuitive API
Modern Deployment
Enterprise-Ready Foundation
Developer Experience
Here's a quick example of how simple it is to create a bot:
import { createBot, mention, text } from "@fedify/botkit";
const bot = createBot<void>({
username: "greetbot",
name: "Greet Bot",
summary: text`A friendly bot that greets people!`,
// ... configuration ...
});
// Respond to mentions
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}! Thanks for saying hello!`);
};
export default bot;
Getting Started:
deno add jsr:@fedify/botkit@^0.1.0-dev
Check out our documentation at https://botkit.fedify.dev/ to learn more!
@tmnt@logos.deno.dev ยท Reply to BotKit by Fedify :botkit:'s post
@botkit@hollo.social
@tmnt Powered by Fedify: BotKit