860 lines
18 KiB
Markdown
860 lines
18 KiB
Markdown
|
|
# General Bots - New Keywords Reference
|
||
|
|
|
||
|
|
> Complete reference for all new BASIC keywords implemented for General Bots Office Suite
|
||
|
|
|
||
|
|
## Table of Contents
|
||
|
|
|
||
|
|
1. [Social Media Keywords](#social-media-keywords)
|
||
|
|
2. [Form Handling & Webhooks](#form-handling--webhooks)
|
||
|
|
3. [Template Messaging](#template-messaging)
|
||
|
|
4. [Lead Scoring & CRM](#lead-scoring--crm)
|
||
|
|
5. [Math Functions](#math-functions)
|
||
|
|
6. [Date/Time Functions](#datetime-functions)
|
||
|
|
7. [String Functions](#string-functions)
|
||
|
|
8. [Validation Functions](#validation-functions)
|
||
|
|
9. [Array Functions](#array-functions)
|
||
|
|
10. [Error Handling](#error-handling)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Social Media Keywords
|
||
|
|
|
||
|
|
### POST TO
|
||
|
|
|
||
|
|
Post content to social media platforms.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Post to single platform
|
||
|
|
POST TO INSTAGRAM image, "Check out our new feature! #AI #Automation"
|
||
|
|
|
||
|
|
' Post to specific platforms
|
||
|
|
POST TO FACEBOOK image, caption
|
||
|
|
POST TO LINKEDIN image, caption
|
||
|
|
POST TO TWITTER image, caption
|
||
|
|
|
||
|
|
' Post to multiple platforms at once
|
||
|
|
POST TO "instagram,facebook,linkedin" image, caption
|
||
|
|
```
|
||
|
|
|
||
|
|
### POST TO ... AT (Scheduled Posting)
|
||
|
|
|
||
|
|
Schedule posts for future publishing.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Schedule a post
|
||
|
|
POST TO INSTAGRAM AT "2025-02-01 10:00" image, caption
|
||
|
|
POST TO FACEBOOK AT "2025-02-15 09:00" image, "Coming soon!"
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET METRICS
|
||
|
|
|
||
|
|
Retrieve engagement metrics for posts.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Get Instagram metrics
|
||
|
|
metrics = GET INSTAGRAM METRICS "post-id"
|
||
|
|
TALK "Likes: " + metrics.likes + ", Comments: " + metrics.comments
|
||
|
|
|
||
|
|
' Get Facebook metrics
|
||
|
|
fb_metrics = GET FACEBOOK METRICS "post-id"
|
||
|
|
TALK "Shares: " + fb_metrics.shares
|
||
|
|
|
||
|
|
' Get LinkedIn metrics
|
||
|
|
li_metrics = GET LINKEDIN METRICS "post-id"
|
||
|
|
|
||
|
|
' Get Twitter metrics
|
||
|
|
tw_metrics = GET TWITTER METRICS "post-id"
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET POSTS
|
||
|
|
|
||
|
|
List posts from a platform.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Get all Instagram posts
|
||
|
|
posts = GET INSTAGRAM POSTS
|
||
|
|
|
||
|
|
' Get Facebook posts
|
||
|
|
fb_posts = GET FACEBOOK POSTS
|
||
|
|
```
|
||
|
|
|
||
|
|
### DELETE POST
|
||
|
|
|
||
|
|
Remove a scheduled or published post.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
DELETE POST "post-id"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Form Handling & Webhooks
|
||
|
|
|
||
|
|
### ON FORM SUBMIT
|
||
|
|
|
||
|
|
Register webhook handlers for form submissions from landing pages.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Basic form handler
|
||
|
|
ON FORM SUBMIT "landing-page-form"
|
||
|
|
' Access form fields
|
||
|
|
name = fields.name
|
||
|
|
email = fields.email
|
||
|
|
phone = fields.phone
|
||
|
|
|
||
|
|
' Access metadata
|
||
|
|
source = metadata.utm_source
|
||
|
|
referrer = metadata.referrer
|
||
|
|
|
||
|
|
' Process the submission
|
||
|
|
SAVE "leads.csv", name, email, phone, source
|
||
|
|
SEND MAIL email, "Welcome!", "Thank you for your interest..."
|
||
|
|
END ON
|
||
|
|
|
||
|
|
' Form handler with validation
|
||
|
|
ON FORM SUBMIT "contact-form" WITH VALIDATION
|
||
|
|
' Validation is automatically applied
|
||
|
|
' Required fields, email format, phone format checked
|
||
|
|
END ON
|
||
|
|
```
|
||
|
|
|
||
|
|
### WEBHOOK
|
||
|
|
|
||
|
|
Create custom webhook endpoints.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Register a webhook endpoint
|
||
|
|
WEBHOOK "order-received"
|
||
|
|
|
||
|
|
' The webhook will be available at:
|
||
|
|
' https://your-server/bot-name/webhook/order-received
|
||
|
|
```
|
||
|
|
|
||
|
|
### SET SCHEDULE
|
||
|
|
|
||
|
|
Schedule scripts to run at specific times.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Run daily at 9 AM
|
||
|
|
SET SCHEDULE "0 9 * * *", "daily-report.bas"
|
||
|
|
|
||
|
|
' Run every Monday at 10 AM
|
||
|
|
SET SCHEDULE "0 10 * * 1", "weekly-summary.bas"
|
||
|
|
|
||
|
|
' Run on specific date
|
||
|
|
SET SCHEDULE DATEADD(TODAY(), 3, "day"), "followup.bas"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Template Messaging
|
||
|
|
|
||
|
|
### SEND TEMPLATE
|
||
|
|
|
||
|
|
Send templated messages across multiple channels.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Send email template
|
||
|
|
SEND TEMPLATE "welcome", "email", "user@example.com", #{name: "John", product: "Pro Plan"}
|
||
|
|
|
||
|
|
' Send WhatsApp template
|
||
|
|
SEND TEMPLATE "order-confirmation", "whatsapp", "+1234567890", #{order_id: "12345"}
|
||
|
|
|
||
|
|
' Send SMS template
|
||
|
|
SEND TEMPLATE "verification", "sms", "+1234567890", #{code: "123456"}
|
||
|
|
|
||
|
|
' Send to multiple channels at once
|
||
|
|
SEND TEMPLATE "announcement", "email,whatsapp", recipient, variables
|
||
|
|
|
||
|
|
' Simplified syntax without variables
|
||
|
|
SEND TEMPLATE "reminder", "email", "user@example.com"
|
||
|
|
```
|
||
|
|
|
||
|
|
### SEND TEMPLATE TO (Bulk)
|
||
|
|
|
||
|
|
Send templates to multiple recipients.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Bulk email send
|
||
|
|
recipients = ["a@example.com", "b@example.com", "c@example.com"]
|
||
|
|
count = SEND TEMPLATE "newsletter" TO "email" recipients, #{month: "January"}
|
||
|
|
TALK "Sent to " + count + " recipients"
|
||
|
|
```
|
||
|
|
|
||
|
|
### CREATE TEMPLATE
|
||
|
|
|
||
|
|
Create new message templates.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Create email template
|
||
|
|
CREATE TEMPLATE "welcome", "email", "Welcome to {{company}}!", "Hello {{name}}, thank you for joining us!"
|
||
|
|
|
||
|
|
' Create WhatsApp template
|
||
|
|
CREATE TEMPLATE "order-update", "whatsapp", "", "Your order {{order_id}} is {{status}}."
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET TEMPLATE
|
||
|
|
|
||
|
|
Retrieve a template.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
template = GET TEMPLATE "welcome"
|
||
|
|
TALK "Template body: " + template.body
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Lead Scoring & CRM
|
||
|
|
|
||
|
|
### SCORE LEAD
|
||
|
|
|
||
|
|
Calculate lead score based on profile and behavior data.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Score a lead
|
||
|
|
lead_data = NEW OBJECT
|
||
|
|
lead_data.email = "john@company.com"
|
||
|
|
lead_data.name = "John Smith"
|
||
|
|
lead_data.company = "Acme Corp"
|
||
|
|
lead_data.job_title = "VP of Engineering"
|
||
|
|
lead_data.industry = "Technology"
|
||
|
|
lead_data.company_size = "Enterprise"
|
||
|
|
|
||
|
|
score = SCORE LEAD lead_data
|
||
|
|
|
||
|
|
TALK "Score: " + score.score
|
||
|
|
TALK "Grade: " + score.grade
|
||
|
|
TALK "Status: " + score.status
|
||
|
|
TALK "Recommendations: " + score.recommendations[0]
|
||
|
|
```
|
||
|
|
|
||
|
|
### AI SCORE LEAD
|
||
|
|
|
||
|
|
Use AI/LLM-enhanced scoring for better accuracy.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' AI-enhanced scoring
|
||
|
|
score = AI SCORE LEAD lead_data
|
||
|
|
|
||
|
|
TALK "AI Score: " + score.score
|
||
|
|
TALK "AI Confidence: " + score.breakdown.ai_confidence
|
||
|
|
```
|
||
|
|
|
||
|
|
### GET LEAD SCORE
|
||
|
|
|
||
|
|
Retrieve existing lead score.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Get stored score
|
||
|
|
score = GET LEAD SCORE "lead-id"
|
||
|
|
TALK "Current score: " + score.score
|
||
|
|
```
|
||
|
|
|
||
|
|
### QUALIFY LEAD
|
||
|
|
|
||
|
|
Check if lead meets qualification threshold.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Default threshold (70)
|
||
|
|
result = QUALIFY LEAD "lead-id"
|
||
|
|
IF result.qualified THEN
|
||
|
|
TALK "Lead is qualified: " + result.status
|
||
|
|
END IF
|
||
|
|
|
||
|
|
' Custom threshold
|
||
|
|
result = QUALIFY LEAD "lead-id", 80
|
||
|
|
IF result.qualified THEN
|
||
|
|
TALK "Lead meets 80+ threshold"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### UPDATE LEAD SCORE
|
||
|
|
|
||
|
|
Manually adjust a lead's score.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Add points for engagement
|
||
|
|
new_score = UPDATE LEAD SCORE "lead-id", 10, "Attended webinar"
|
||
|
|
|
||
|
|
' Deduct points for inactivity
|
||
|
|
new_score = UPDATE LEAD SCORE "lead-id", -5, "No response to email"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Math Functions
|
||
|
|
|
||
|
|
### Basic Math
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Absolute value
|
||
|
|
result = ABS(-42) ' Returns 42
|
||
|
|
|
||
|
|
' Rounding
|
||
|
|
result = ROUND(3.7) ' Returns 4
|
||
|
|
result = ROUND(3.14159, 2) ' Returns 3.14
|
||
|
|
|
||
|
|
' Integer conversion
|
||
|
|
result = INT(3.9) ' Returns 3
|
||
|
|
result = FIX(-3.9) ' Returns -3
|
||
|
|
result = FLOOR(3.7) ' Returns 3
|
||
|
|
result = CEIL(3.2) ' Returns 4
|
||
|
|
```
|
||
|
|
|
||
|
|
### Min/Max
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Two values
|
||
|
|
result = MAX(10, 20) ' Returns 20
|
||
|
|
result = MIN(10, 20) ' Returns 10
|
||
|
|
|
||
|
|
' Array values
|
||
|
|
arr = [5, 2, 8, 1, 9]
|
||
|
|
result = MAX(arr) ' Returns 9
|
||
|
|
result = MIN(arr) ' Returns 1
|
||
|
|
```
|
||
|
|
|
||
|
|
### Other Math Functions
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Modulo
|
||
|
|
result = MOD(17, 5) ' Returns 2
|
||
|
|
|
||
|
|
' Random numbers
|
||
|
|
result = RANDOM() ' Random 0-1
|
||
|
|
result = RANDOM(100) ' Random 0-99
|
||
|
|
result = RANDOM(1, 10) ' Random 1-10
|
||
|
|
|
||
|
|
' Sign
|
||
|
|
result = SGN(-5) ' Returns -1
|
||
|
|
result = SGN(5) ' Returns 1
|
||
|
|
result = SGN(0) ' Returns 0
|
||
|
|
|
||
|
|
' Square root
|
||
|
|
result = SQR(16) ' Returns 4
|
||
|
|
result = SQRT(25) ' Returns 5
|
||
|
|
|
||
|
|
' Logarithms
|
||
|
|
result = LOG(10) ' Natural log
|
||
|
|
result = LOG10(100) ' Base 10 log
|
||
|
|
|
||
|
|
' Exponential
|
||
|
|
result = EXP(2) ' e^2
|
||
|
|
|
||
|
|
' Power
|
||
|
|
result = POW(2, 8) ' Returns 256
|
||
|
|
result = POWER(3, 4) ' Returns 81
|
||
|
|
|
||
|
|
' Trigonometry
|
||
|
|
result = SIN(0) ' Returns 0
|
||
|
|
result = COS(0) ' Returns 1
|
||
|
|
result = TAN(0) ' Returns 0
|
||
|
|
pi = PI() ' Returns 3.14159...
|
||
|
|
|
||
|
|
' Aggregation
|
||
|
|
arr = [10, 20, 30, 40, 50]
|
||
|
|
result = SUM(arr) ' Returns 150
|
||
|
|
result = AVG(arr) ' Returns 30
|
||
|
|
result = AVERAGE(arr) ' Returns 30
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Date/Time Functions
|
||
|
|
|
||
|
|
### Current Date/Time
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Current date and time
|
||
|
|
now = NOW() ' "2025-01-22 14:30:45"
|
||
|
|
now_utc = NOW_UTC() ' UTC time
|
||
|
|
|
||
|
|
' Current date only
|
||
|
|
today = TODAY() ' "2025-01-22"
|
||
|
|
|
||
|
|
' Current time only
|
||
|
|
time = TIME() ' "14:30:45"
|
||
|
|
|
||
|
|
' Unix timestamp
|
||
|
|
ts = TIMESTAMP() ' 1737556245
|
||
|
|
```
|
||
|
|
|
||
|
|
### Date Components
|
||
|
|
|
||
|
|
```basic
|
||
|
|
date = "2025-01-22"
|
||
|
|
|
||
|
|
year = YEAR(date) ' Returns 2025
|
||
|
|
month = MONTH(date) ' Returns 1
|
||
|
|
day = DAY(date) ' Returns 22
|
||
|
|
weekday = WEEKDAY(date) ' Returns 4 (Wednesday)
|
||
|
|
week = WEEKNUM(date) ' Returns 4
|
||
|
|
|
||
|
|
datetime = "2025-01-22 14:30:45"
|
||
|
|
hour = HOUR(datetime) ' Returns 14
|
||
|
|
minute = MINUTE(datetime) ' Returns 30
|
||
|
|
second = SECOND(datetime) ' Returns 45
|
||
|
|
```
|
||
|
|
|
||
|
|
### Date Arithmetic
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Add to date
|
||
|
|
future = DATEADD("2025-01-22", 7, "day") ' "2025-01-29"
|
||
|
|
future = DATEADD("2025-01-22", 1, "month") ' "2025-02-22"
|
||
|
|
future = DATEADD("2025-01-22", 1, "year") ' "2026-01-22"
|
||
|
|
future = DATEADD("2025-01-22 10:00", 2, "hour") ' "2025-01-22 12:00:00"
|
||
|
|
|
||
|
|
' Subtract from date (negative values)
|
||
|
|
past = DATEADD("2025-01-22", -7, "day") ' "2025-01-15"
|
||
|
|
|
||
|
|
' Date difference
|
||
|
|
days = DATEDIFF("2025-01-01", "2025-01-22", "day") ' 21
|
||
|
|
months = DATEDIFF("2025-01-01", "2025-06-01", "month") ' 5
|
||
|
|
years = DATEDIFF("2020-01-01", "2025-01-01", "year") ' 5
|
||
|
|
```
|
||
|
|
|
||
|
|
### Date Formatting
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Format date
|
||
|
|
formatted = FORMAT_DATE("2025-01-22", "DD/MM/YYYY") ' "22/01/2025"
|
||
|
|
formatted = FORMAT_DATE("2025-01-22", "MMMM DD, YYYY") ' "January 22, 2025"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Date Validation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check if valid date
|
||
|
|
valid = ISDATE("2025-01-22") ' true
|
||
|
|
valid = ISDATE("invalid") ' false
|
||
|
|
```
|
||
|
|
|
||
|
|
### End of Month
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Get last day of month
|
||
|
|
eom = EOMONTH("2025-01-15", 0) ' "2025-01-31"
|
||
|
|
eom = EOMONTH("2025-01-15", 1) ' "2025-02-28"
|
||
|
|
eom = EOMONTH("2025-01-15", -1) ' "2024-12-31"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## String Functions
|
||
|
|
|
||
|
|
### Length and Substrings
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' String length
|
||
|
|
length = LEN("Hello World") ' Returns 11
|
||
|
|
|
||
|
|
' Left portion
|
||
|
|
result = LEFT("Hello World", 5) ' Returns "Hello"
|
||
|
|
|
||
|
|
' Right portion
|
||
|
|
result = RIGHT("Hello World", 5) ' Returns "World"
|
||
|
|
|
||
|
|
' Middle portion
|
||
|
|
result = MID("Hello World", 7) ' Returns "World"
|
||
|
|
result = MID("Hello World", 7, 3) ' Returns "Wor"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Case Conversion
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Uppercase
|
||
|
|
result = UCASE("hello") ' Returns "HELLO"
|
||
|
|
result = UPPER("hello") ' Returns "HELLO"
|
||
|
|
|
||
|
|
' Lowercase
|
||
|
|
result = LCASE("HELLO") ' Returns "hello"
|
||
|
|
result = LOWER("HELLO") ' Returns "hello"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Trimming
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Trim whitespace
|
||
|
|
result = TRIM(" hello ") ' Returns "hello"
|
||
|
|
result = LTRIM(" hello") ' Returns "hello"
|
||
|
|
result = RTRIM("hello ") ' Returns "hello"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Search and Replace
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Find position (1-based)
|
||
|
|
pos = INSTR("Hello World", "World") ' Returns 7
|
||
|
|
pos = INSTR(5, "one two one", "one") ' Returns 9 (starting from position 5)
|
||
|
|
|
||
|
|
' Replace
|
||
|
|
result = REPLACE("Hello World", "World", "Universe") ' Returns "Hello Universe"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Split and Join
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Split string to array
|
||
|
|
parts = SPLIT("a,b,c,d", ",") ' Returns ["a", "b", "c", "d"]
|
||
|
|
|
||
|
|
' Join array to string
|
||
|
|
arr = ["a", "b", "c"]
|
||
|
|
result = JOIN(arr, "-") ' Returns "a-b-c"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Validation Functions
|
||
|
|
|
||
|
|
### Type Conversion
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' String to number
|
||
|
|
num = VAL("42") ' Returns 42.0
|
||
|
|
num = VAL("3.14") ' Returns 3.14
|
||
|
|
num = CINT("42.7") ' Returns 43 (rounded integer)
|
||
|
|
num = CDBL("3.14") ' Returns 3.14
|
||
|
|
|
||
|
|
' Number to string
|
||
|
|
str = STR(42) ' Returns "42"
|
||
|
|
str = CSTR(3.14) ' Returns "3.14"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Null/Empty Checks
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check for null
|
||
|
|
result = ISNULL(value) ' true if null/unit
|
||
|
|
|
||
|
|
' Check for empty
|
||
|
|
result = ISEMPTY("") ' true
|
||
|
|
result = ISEMPTY([]) ' true (empty array)
|
||
|
|
result = ISEMPTY(#{}) ' true (empty map)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Type Checks
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check types
|
||
|
|
result = ISSTRING("hello") ' true
|
||
|
|
result = ISNUMBER(42) ' true
|
||
|
|
result = ISNUMBER(3.14) ' true
|
||
|
|
result = ISBOOL(true) ' true
|
||
|
|
result = ISARRAY([1, 2, 3]) ' true
|
||
|
|
result = ISOBJECT(#{a: 1}) ' true
|
||
|
|
result = IS_NUMERIC("42") ' true
|
||
|
|
result = IS_DATE("2025-01-22") ' true
|
||
|
|
|
||
|
|
' Get type name
|
||
|
|
type = TYPEOF(value) ' Returns type name as string
|
||
|
|
```
|
||
|
|
|
||
|
|
### Coalesce/Default Values
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Return first non-null value
|
||
|
|
result = NVL(null_value, "default") ' Returns "default"
|
||
|
|
result = COALESCE(null_value, "default") ' Same as NVL
|
||
|
|
```
|
||
|
|
|
||
|
|
### Conditional
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Inline if
|
||
|
|
result = IIF(score >= 70, "Pass", "Fail")
|
||
|
|
|
||
|
|
' Choose from list (1-based index)
|
||
|
|
result = CHOOSE(2, ["A", "B", "C"]) ' Returns "B"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Array Functions
|
||
|
|
|
||
|
|
### Creating Arrays
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Create array
|
||
|
|
arr = ARRAY(1, 2, 3, 4, 5)
|
||
|
|
|
||
|
|
' Create range
|
||
|
|
arr = RANGE(1, 10) ' [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||
|
|
arr = RANGE(0, 10, 2) ' [0, 2, 4, 6, 8, 10]
|
||
|
|
```
|
||
|
|
|
||
|
|
### Array Info
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Array bounds
|
||
|
|
arr = [10, 20, 30, 40, 50]
|
||
|
|
upper = UBOUND(arr) ' Returns 4 (last index)
|
||
|
|
lower = LBOUND(arr) ' Returns 0 (first index)
|
||
|
|
count = COUNT(arr) ' Returns 5 (length)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Searching
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Check if contains
|
||
|
|
result = CONTAINS(arr, 30) ' true
|
||
|
|
result = IN_ARRAY(30, arr) ' true (alternate syntax)
|
||
|
|
|
||
|
|
' Find index
|
||
|
|
index = INDEX_OF(arr, 30) ' Returns 2 (-1 if not found)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sorting
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Sort ascending
|
||
|
|
sorted = SORT(arr)
|
||
|
|
|
||
|
|
' Sort descending
|
||
|
|
sorted = SORT_DESC(arr)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Uniqueness
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Remove duplicates
|
||
|
|
arr = [1, 2, 2, 3, 3, 3]
|
||
|
|
unique = UNIQUE(arr) ' [1, 2, 3]
|
||
|
|
unique = DISTINCT(arr) ' Same as UNIQUE
|
||
|
|
```
|
||
|
|
|
||
|
|
### Manipulation
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Add to end
|
||
|
|
arr = PUSH(arr, 60)
|
||
|
|
|
||
|
|
' Remove from end
|
||
|
|
last = POP(arr)
|
||
|
|
|
||
|
|
' Add to beginning
|
||
|
|
arr = UNSHIFT(arr, 0)
|
||
|
|
|
||
|
|
' Remove from beginning
|
||
|
|
first = SHIFT(arr)
|
||
|
|
|
||
|
|
' Reverse
|
||
|
|
reversed = REVERSE(arr)
|
||
|
|
|
||
|
|
' Get slice
|
||
|
|
part = SLICE(arr, 1) ' From index 1 to end
|
||
|
|
part = SLICE(arr, 1, 3) ' From index 1 to 3 (exclusive)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Combining
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Concatenate arrays
|
||
|
|
combined = CONCAT(arr1, arr2)
|
||
|
|
|
||
|
|
' Flatten nested arrays
|
||
|
|
nested = [[1, 2], [3, 4], [5]]
|
||
|
|
flat = FLATTEN(nested) ' [1, 2, 3, 4, 5]
|
||
|
|
```
|
||
|
|
|
||
|
|
### Element Access
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' First and last elements
|
||
|
|
first = FIRST_ELEM(arr)
|
||
|
|
last = LAST_ELEM(arr)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Error Handling
|
||
|
|
|
||
|
|
### Throwing Errors
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Throw an error
|
||
|
|
THROW "Something went wrong"
|
||
|
|
|
||
|
|
' Raise (alias for THROW)
|
||
|
|
RAISE "Invalid input"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Error Objects
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Create error object (for inspection)
|
||
|
|
err = ERROR("Validation failed")
|
||
|
|
' err.error = true
|
||
|
|
' err.message = "Validation failed"
|
||
|
|
' err.timestamp = "2025-01-22 14:30:45"
|
||
|
|
|
||
|
|
' Check if value is error
|
||
|
|
IF IS_ERROR(result) THEN
|
||
|
|
msg = GET_ERROR_MESSAGE(result)
|
||
|
|
TALK "Error occurred: " + msg
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Assertions
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Assert condition
|
||
|
|
ASSERT score >= 0, "Score cannot be negative"
|
||
|
|
ASSERT NOT ISEMPTY(name), "Name is required"
|
||
|
|
|
||
|
|
' If assertion fails, throws error with message
|
||
|
|
```
|
||
|
|
|
||
|
|
### Logging
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Log messages at different levels
|
||
|
|
LOG_ERROR "Critical failure in processing"
|
||
|
|
LOG_WARN "Unusual condition detected"
|
||
|
|
LOG_INFO "Processing completed"
|
||
|
|
LOG_DEBUG "Variable value: " + STR(x)
|
||
|
|
```
|
||
|
|
|
||
|
|
### TRY/CATCH Pattern
|
||
|
|
|
||
|
|
While Rhai doesn't support traditional TRY...CATCH, use this pattern:
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Using error checking pattern
|
||
|
|
result = potentially_failing_operation()
|
||
|
|
|
||
|
|
IF IS_ERROR(result) THEN
|
||
|
|
LOG_ERROR GET_ERROR_MESSAGE(result)
|
||
|
|
result = TRY_RESULT(false, (), "Operation failed")
|
||
|
|
ELSE
|
||
|
|
result = TRY_RESULT(true, result, "")
|
||
|
|
END IF
|
||
|
|
|
||
|
|
' result.success = true/false
|
||
|
|
' result.value = the actual value if successful
|
||
|
|
' result.error = error message if failed
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Campaign Examples
|
||
|
|
|
||
|
|
### Welcome Campaign
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Start welcome campaign for new lead
|
||
|
|
lead_email = "newuser@example.com"
|
||
|
|
lead_name = "John"
|
||
|
|
|
||
|
|
' Send immediate welcome
|
||
|
|
vars = #{name: lead_name, company: "Acme"}
|
||
|
|
SEND TEMPLATE "welcome-email-1", "email", lead_email, vars
|
||
|
|
|
||
|
|
' Schedule follow-ups
|
||
|
|
SET SCHEDULE DATEADD(TODAY(), 2, "day"), "send-welcome-2.bas"
|
||
|
|
SET SCHEDULE DATEADD(TODAY(), 5, "day"), "send-welcome-3.bas"
|
||
|
|
SET SCHEDULE DATEADD(TODAY(), 14, "day"), "send-welcome-final.bas"
|
||
|
|
|
||
|
|
' Score the lead
|
||
|
|
score = SCORE LEAD #{email: lead_email, name: lead_name}
|
||
|
|
TALK "Welcome campaign started. Initial score: " + score.score
|
||
|
|
```
|
||
|
|
|
||
|
|
### Social Media Campaign
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Product launch social media campaign
|
||
|
|
product_name = "AI Assistant Pro"
|
||
|
|
launch_date = "2025-02-15"
|
||
|
|
|
||
|
|
' Generate image
|
||
|
|
product_image = IMAGE "Product launch graphic for " + product_name
|
||
|
|
|
||
|
|
' Schedule posts across platforms
|
||
|
|
hashtags = "#AI #Automation #NewProduct"
|
||
|
|
|
||
|
|
' Day -7: Teaser
|
||
|
|
POST TO "instagram,facebook,linkedin" AT DATEADD(launch_date, -7, "day") + " 10:00" product_image, "Something big is coming... 🔥 " + hashtags
|
||
|
|
|
||
|
|
' Day -3: Feature preview
|
||
|
|
POST TO "instagram,twitter" AT DATEADD(launch_date, -3, "day") + " 10:00" product_image, "Sneak peek! " + hashtags
|
||
|
|
|
||
|
|
' Launch day
|
||
|
|
POST TO "instagram,facebook,twitter,linkedin" AT launch_date + " 09:00" product_image, "🚀 IT'S HERE! " + product_name + " is now LIVE! " + hashtags
|
||
|
|
|
||
|
|
TALK "Social media campaign scheduled with " + 6 + " posts"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Lead Nurturing with AI Scoring
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Process form submission
|
||
|
|
ON FORM SUBMIT "landing-page"
|
||
|
|
' Extract data
|
||
|
|
lead = #{
|
||
|
|
email: fields.email,
|
||
|
|
name: fields.name,
|
||
|
|
company: fields.company,
|
||
|
|
job_title: fields.title,
|
||
|
|
industry: fields.industry
|
||
|
|
}
|
||
|
|
|
||
|
|
' AI-powered scoring
|
||
|
|
score = AI SCORE LEAD lead
|
||
|
|
|
||
|
|
' Route based on score
|
||
|
|
IF score.score >= 85 THEN
|
||
|
|
' Hot lead - immediate action
|
||
|
|
CREATE TASK "Contact hot lead: " + lead.email, "sales", "high"
|
||
|
|
SEND TEMPLATE "hot-lead-welcome", "email,sms", lead.email, lead
|
||
|
|
ELSE IF score.score >= 70 THEN
|
||
|
|
' Warm lead - accelerated nurture
|
||
|
|
SEND TEMPLATE "warm-welcome", "email", lead.email, lead
|
||
|
|
SET SCHEDULE DATEADD(NOW(), 3, "day"), "warm-nurture-2.bas"
|
||
|
|
ELSE
|
||
|
|
' Cold lead - standard drip
|
||
|
|
SEND TEMPLATE "cold-welcome", "email", lead.email, lead
|
||
|
|
SET SCHEDULE DATEADD(NOW(), 7, "day"), "cold-nurture-2.bas"
|
||
|
|
END IF
|
||
|
|
|
||
|
|
' Save to CRM
|
||
|
|
SAVE "leads", lead.email, lead.name, score.score, score.grade, NOW()
|
||
|
|
END ON
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
### Social Media Credentials
|
||
|
|
|
||
|
|
Store in `bot_settings` table:
|
||
|
|
- `instagram_credentials`: `{access_token, user_id}`
|
||
|
|
- `facebook_credentials`: `{access_token, page_id}`
|
||
|
|
- `linkedin_credentials`: `{access_token, person_urn}`
|
||
|
|
- `twitter_credentials`: `{bearer_token}`
|
||
|
|
|
||
|
|
### Lead Scoring Weights
|
||
|
|
|
||
|
|
Default weights (customizable per bot):
|
||
|
|
|
||
|
|
| Factor | Default Weight |
|
||
|
|
|--------|---------------|
|
||
|
|
| Company Size | 10 |
|
||
|
|
| Industry Match | 15 |
|
||
|
|
| Job Title | 15 |
|
||
|
|
| Location | 5 |
|
||
|
|
| Email Opens | 5 |
|
||
|
|
| Email Clicks | 10 |
|
||
|
|
| Page Visits | 5 |
|
||
|
|
| Form Submissions | 15 |
|
||
|
|
| Content Downloads | 10 |
|
||
|
|
| Pricing Page Visits | 20 |
|
||
|
|
| Demo Requests | 25 |
|
||
|
|
| Trial Signups | 30 |
|
||
|
|
| Inactivity Penalty | -15 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*Last updated: January 2025*
|
||
|
|
*General Bots v5.0*
|