Skip to main content

Custom Function

In this guide, we will explain how to create your own functions for aoitelegram.

Why and When Do You Need This?​

Since developers may not always add a particular function to the library, you can create a function yourself, which can be used not only by you but also by anyone who installs your npm package.

How to Use​

In the PluginManager class constructor, it's not mandatory to specify the parameter that searches for .aoiplugin.json files in the node_modules folders and moves them to the node_modules/.aoiplugins directory for later use in your project.

const { AoiClient, PluginManager } = require("aoitelegram");

const bot = new AoiClient({
token: "",
});

const loadPlugin = new PluginManager({
client: bot,
searchingForPlugins: true, // node_modules searching
});
// dir: functions/
loadPlugin.loadDirPlugins("./functions");
// dir: node_modules/.aoiplugins/
loadPlugin.loadPlugins("path plugin", "commit");
const { AoiClient } = require("aoitelegram");

const bot = new AoiClient({
token: "",
});

// array or object
bot.addFunction([]);
bot.addFunction();

The structure of plugins for npm packages should be as follows:

dirName
.aoiplugin.json

In aoiplugin.json, the only parameter used is the path to the files or file that should be used:

{
"name": "./src/",
"version": "0.1.2"
}

Example of Creation​

export default {
name: "$await",
callback: context => {
const [time = 1] = context.splits;
return new Promise((res) => setTimeout(() => res(""), time * 1000));
},
};

Function js​

  • ctx is the function context.

Ctx​

ContextFunction {
data: { name: string; inside?: string; splits: string[] }[];
negative?: boolean;
inside: string | undefined;
splits: (string | undefined)[];
localVars: Collection<string, unknown>;
random: Collection<string, unknown>;
buffer: Collection<string, Buffer>;
array: Collection<string, unknown>;
callback_query: unknown[];
event: EventContext &
UserFromGetMe &
Message &
MessageReactionUpdated &
MessageReactionCountUpdated &
CallbackQuery &
InlineQuery &
ShippingQuery &
PreCheckoutQuery &
Poll &
PollAnswer &
ChatMemberUpdated &
ChatJoinRequest &
ChatBoostUpdated &
ChatBoostRemoved & { telegram: AoiClient };
telegram: AoiClient;
code: string;
command: { name: string; hasCommand?: boolean; hasEvent?: boolean };
isError: boolean;
argsCheck: (amount: number) => unknown;
checkArgumentTypes: (expectedArgumentTypes: string[]) => void;
sendError: (error: string, custom?: boolean) => unknown;
database: AoiManager | MongoDBManager;
currentFunction: string;
[key: string]: any;
suppressErrors?: string;
packageJSON: aoitelegram;
}

It has the following methods:

  • inside - string of arguments that were passed.

  • splits - array of arguments provided by the user.

  • argsCheck - checks the number of arguments passed to the function.

    • count - the expected number of arguments in the function.
  • sendError - sends reported errors and also halts the execution of subsequent functions in the context.

    • text - error text in HTML style.
    • custom - (optional) custom error text, either user-defined or integrated into the library.
  • checkArgumentTypes - Checks whether the provided arguments match the expected argument types for a function.

    • expectedArgumentTypes - Array of expected argument types
    • Types available for checking: number, object, string, nan, undefined, null, unknown, boolean.

Example​

client.addFunction({
name: "$log",
callback: context => {
context.argsCheck(1);
context.checkArgumentTypes(["string | number | boolean"]);
if (context.isError) return;

console.log(...context.splits);
return "";
}
});
client.addFunction({
name: "$onlyArgsType",
callback: context => {
context.argsCheck(2);
context.checkArgumentTypes(["...number"]);
if (context.isError) return;

let text = "";
context.splits.forEach((elem) => text += `${elem}\n`);
return text;
}
});
client.addFunction({
name: "$log",
callback: context => {
context.argsCheck(1);
context.checkArgumentTypes(["string | number | boolean"]);
if (context.isError) return;

console.log(context.inside);
// or
console.log(context.splits);
return "";
}
});
client.addFunction({
name: "$stopping",
callback: context => {
context.sendError(context.splits.join(", "));
}
});
note

If you specify a function that already exists in the library, it will be overwritten. This means custom functions take precedence over basic library functions.

note

Starting from aoitelegram@0.7.0 and above, the <AoiClient>.addFunction method cannot modify a function, and <AoiClient>.editFunction cannot add a function as before. Errors will occur when attempting to do so. To avoid such usage, use <AoiClient>.hasFunction or <AoiClient>.ensureFunction, which handle everything for you.

<AoiClient>.removeFunction(func: string | string[])​

If you want to remove a function, there is a method called

<AoiClient>.editFunction(options: DataFunction | DataFunction[]): boolean​

Edits or adds a data function to the available functions.

  • options: A single DataFunction or an array of DataFunction objects.
  • Returns true after successfully editing or adding the function(s).

<AoiClient>.getFunction(options: string | string[])​

Retrieves a function from the available functions.

  • options: A single function name or an array of function names.
  • Returns the requested function(s).

<AoiClient>.countFunction​

Gets the count of available functions.

  • Returns the number of functions currently available.

<AoiClient>.ensureFunction(options: DataFunction | DataFunction[]): AoiClient​

Ensures the registration of a data function or an array of data functions.

  • options: A single data function or an array of data functions.
  • Returns the AoiClient instance for method chaining.

<AoiClient>.hasFunction(options: string | string[]): string | string[]​

Checks if the specified function(s) exist(s).

  • options: The name of the function or an array of function names.
  • Returns True if the function(s) exist(s).

Function aoitelegram​

$argumentsCount​

  • Returns the number of function args