# Plang * [About](#about) * [The Plang Language](#the-plang-language) * [PBot commands](#pbot-commands) * [plang](#plang-1) * [plangrepl](#plangrepl) * [PBot built-in Plang functions](#pbot-built-in-plang-functions) * [factget](#factget) * [factset](#factset) * [factappend](#factappend) * [userget](#userget) * [Examples](#examples) * [Basic examples](#basic-examples) * [Karma example](#karma-example) ## About The Plang plugin provides a scripting interface to PBot. It has access to PBot internal APIs and state. ## The Plang Language The scripting language is [Plang](https://github.com/pragma-/Plang). It was written specifically for PBot, but aims to be powerful enough to be used as a general-purpose scripting language embedded into any Perl application. This document describes PBot's Plang plugin. To learn how to use the Plang scripting language, see the [Plang documentation](https://github.com/pragma-/Plang/blob/master/README.md). ## PBot commands ### plang Use the `plang` command to run a Plang script. Usage: `plang ` ### plangrepl The `plangrepl` command is identical to the `plang` command, except the environment is preserved in-between commands and the types of values is output along with the value. ## PBot built-in Plang functions [Plang](https://github.com/pragma-/Plang) lets you add custom built-in functions. Several have been added for PBot; they are described here. Function | Signature / Description --- | --- [factget](#factget) | `factget(channel: String, keyword: String, meta: String = "action") -> String \| Null`
Retrieve metadata from factoids [factset](#factset) | `factset(channel: String, keyword: String, text: String, meta: String = "action") -> String`
Sets metadata on factoids [factappend](#factappend) | `factappend(channel: String, keyword: String, text: String) -> String`
Appends to the `action` metadata on factoids [userget](#userget) | `userget(name: String) -> Map \| Null`
Retrieve metadata from users ### factget Use the `factget` function to retrieve metadata from factoids. Signature: `factget(channel: String, keyword: String, meta: String = "action") -> String | Null` The `factget` function takes three paramaters: `channel`, `keyword` and `meta`. The `meta` parameter can be omitted and will default to `"action"`. The `factget` function returns a `String` containing the value of the factoid metadata or `null` if the factoid does not exist. ### factset Use the `factset` function to set metadata values for factoids. The factoid will be created if it does not exist. Signature: `factset(channel: String, keyword: String, text: String, meta: String = "action") -> String` The `factset` function takes four parameters: `channel`, `keyword`, `text`, and optionally `meta`. If the `meta` parameter is omitted it will default to `"action"`. The `factset` function returns a `String` containing the value of `text`. ### factappend Use the `factappend` function to append text to the `action` metadata for factoids. Signature: `factappend(channel: String, keyword: String, text: String) -> String` The `factappend` function takes three parameters: `channel`, `keyword` and `text`. The `factappend` function returns a `String` containing the value of factoid's `action` metadata with `text` appended. ### userget Use the `userget` function to retrieve user metadata. Signature: `userget(name: String) -> Map | Null` The `userget` function takes one parameter: `name`. The `userget` function returns a `Map` containing all the metadata of the user, or `null` if there is no user matching `name`. See the [Plang Map documentation](https://github.com/pragma-/Plang#maps) for a refresher on using Plang maps. ## Examples ### Basic examples !plang userget('pragma-') { channels: "global", hostmasks: "*!*@unaffiliated/pragmatic-chaos", botowner: 1 } !plang userget('pragma-').botowner 1 !plang if userget('pragma-').botowner then print('Greetings master!') else print('Hello mortal.') Greetings master! ### Karma example Here is a quick-and-dirty way to make a simple Karma system. This is a demonstration of what is currently possible with Plang. This will not be its final form. Support for classes will be added soon. We'll use the `factget()` and `factset()` functions to get and store Karma values to an unique unused channel. Let's call it `#karma-data`. To get the first command argument, we'll use PBot's special factoid variable `$arg[0]`. First we add the `++` command. !factadd ++ /call plang var karma = Integer(factget('#karma-data', '$arg[0]')); factset('#karma-data', '$arg[0]', String(karma + 1)); ++ added to global channel. Similarly, we add the `--` command. !factadd -- /call plang var karma = Integer(factget('#karma-data', '$arg[0]')); factset('#karma-data', '$arg[0]', String(karma - 1)); -- added to global channel. Finally, we add the `karma` command. !factadd karma /call plang var k = factget('#karma-data', '$arg[0]'); if k == null then print('No karma for $arg[0] yet.') else print($'Karma for $arg[0]: {k}') karma added to global channel. A short demonstration: !karma nf No karma for nf yet. !-- nf -1 !-- nf -2 !++ nf -1 !karma nf Karma for nf: -1 You can use double quotes to group multiple words as one argument (but not single quotes due to how `$arg[0]` is inserted into single-quoted strings in the Plang snippets). !++ "this and that" 1 !karma "this and that" Karma for "this and that": 1