I wish #AiScript was documented somewhere. The play stuff would be a lot easier to work with if I had any idea what functions, syntax, and parameters were without having to look at other plays and guess.
Presenting: Quick send, a Misskey (and forks) plugin! (Tested in Sharkey)
This plugin lets you quickly send notes to select users! :blobcat_spin:
It works by adding users to a send list. Simply click the 3 dots on their profile (either on their profile page, or in the on hover preview), and at the very bottom you'll see an option to add them (or remove them).
Then, on any note, click on the 3 dots, and at the bottom you'll have a button for each user you've added. :neocat_bongo_down:
There are also options for clearing the list, and in the plugin's settings you can tell it to ask for confirmation, or to show a success dialog box.
To install go to settings > plugins > install and paste the source code:
/// @0.18.0
// This is licensed under MIT
### {
name: "Quick send"
version: "1.0.1"
author: "@linuxenjoyer@blahaj.zone"
description: "Send a note to your besties quickly"
permissions: [ "write:notes" ]
config: {
show_success: {
type: "boolean"
label: "Show success dialog"
description: "Makes a dialog pop up saying that it was sent. I'm not exactly sure how to do error handling, this is more to make sure the plugin didn't randomly crash."
default: false
}
ask_confirmation: {
type: "boolean"
label: "Ask for confirmation"
description: "Asks you if your really want to send the post."
default: false
}
}
}
@save(obj) {
Mk:save("user_send_list", obj)
}
@load() {
var ls = Mk:load("user_send_list")
if (ls == null) {
save({})
ls = {}
}
ls
}
// Simple function to format a username
@formatUsername(user) {
var username = `@{user.username}`
if (user.host != null) {
username = `{username}@{user.host}`
}
username
}
@sendNote(note, userId) {
// This is based on blahaj.zone's api-doc (sharkey)
let res = Mk:api("notes/create" {
visibility: "specified"
renoteId: note.id
visibleUserIds: [ userId ]
})
// TODO: Figure out error handling
true
}
@getAction(username, userId) {
@(note) {
var should_send = !Plugin:config.ask_confirmation
if (!should_send) {
should_send = Mk:confirm(`Send post to {user}?` "" "question")
}
if (should_send) {
let ok = sendNote(note, userId)
// This is a little ugly but idrk how to tidy it up
if (ok) {
if (Plugin:config.show_success) {
Mk:dialog(`Sent note to {username}`, "", "success")
}
} else {
Mk:dialog(`There was an error sending the note to {username}`, "", "error")
}
}
}
}
// Underscores bc it's in global scope
let __ls = load()
each (let usr, Obj:keys(__ls)) {
Plugin:register_note_action(`Send to {usr}`, getAction(usr, __ls[usr]))
}
Plugin:register_user_action("Add user to send list", @(user) {
let username = formatUsername(user)
let ls = load()
if (ls[username] != null) {
Mk:dialog(`{username} is already on the send list`, "", "error")
} else {
ls[username] = user.id
save(ls)
Mk:dialog(`Added {username} to the send list!`, "You might have to refresh to see the changes", "success")
}
})
Plugin:register_user_action("Remove user from send list" @(user) {
let username = formatUsername(user)
let ls = load()
if (ls[username] == null) {
Mk:dialog(`{username} is not on the send list`, "", "error")
} else {
ls[username] = null
save(ls)
Mk:dialog(`Removed {username} from the send list!`, "You might have to refresh to see the changes", "success")
}
})
Plugin:register_note_action("Clear user send list" @(note){
if (Mk:confirm("Are you sure you want to clear the list?", "There's no way to undo this", "warning")) {
save({})
Mk:dialog("List cleared", "You might have to refresh to see the changes", "success")
}
})
Plugin:register_user_action("Clear user send list" @(user){
if (Mk:confirm("Are you sure you want to clear the list?", "There's no way to undo this", "warning")) {
save({})
Mk:dialog("List cleared", "You might have to refresh to see the changes", "success")
}
})
It'll ask for permissions to create notes (it needs this to be able to send stuff) :blobcat_code:
If you found it useful or have feature ideas/patches let me know :neocat_melt_reach:
Does anyone writing #Misskey / #Sharkey Plays (coded in #AiScript) know how to set the privacy/visibility setting of the form in Ui:C:postFormButton? I know I can set a content warning with cw, but I have no idea about setting the default visibility of the note generated by the Play. :Blobhaj_Thinking:
I plan to crudely recreate the "poking" function back in the good 'ol days of #Facebook. What I have in mind is, the user inputs the handle of the user, and then generates a note with Direct visibility to the target handle, a CW containing I poked you! Click to see how to poke back, and then of course the text containing whatever instructions I would write. Shouldn't be too complicated I think.
extremely meh workaround if your #CalcKey / #FireFish timeline keeps jumping around every time you click on a post:
switch to deck layout
set default navigation method to "open in new window"
now every time you click on a post it'll open up as a psuedo-popup that you can then maximize. and that popup doesn't touch your timeline at all, meaning it'll stay where it is in the background
i wish there was a way to automatically maximize windows. maybe #AiScript can take care of that? no idea
Sooo I'm sitting in a hotel room kind of bored, decided to poke around with Calckey Pages and AiScript.
I'm not 100% sure this is going to work for y'all...but...try this out. It SHOULD list your own pages that you've created. Right now, there's a bug in Calckey where the pages kind of disappear 👻 after you save.
Would love to know what forgotten trash or treasures you find if it does work! I need some entertainment. 🗑️ 💎
Finishing up my Calckey Plugins week with a fun one. MFM (Misskey Flavoured Markdown) is quite an expressive art form and a great entry to coding, math, and styling (but having fun and not realizing your'e learning something) 🤫
Here I've created a plugin generator, which writes the AiScript code based on a few pieces of information provided by a user in a form.
Are Calckey Pages and Misskey Pages the same thing? Or has Misskey gone in a different direction since the fork. Hard to follow what's happening here because it's mostly Japanese. Looks interesting tho! @kainoa@freeplay
Continuing my discovery of AiScript and Calckey Plugins with a new entry - “Lister”, which adds post actions in your timelines for adding accounts to your lists in a few clicks.
Check out the end of my blog post for some insights into the development process. #AiScript#CalckeyPlugins