Changed incorrect references to .vbs files to .bas and corrected USE_WEBSITE keyword naming. Also added missing fields to API response structure and clarified that start.bas is optional for bots.
217 lines
6.2 KiB
QBasic
217 lines
6.2 KiB
QBasic
REM General Bots: CALCULATE Keyword - Universal Math Calculator
|
|
REM Perform mathematical calculations and conversions
|
|
REM Can be used by ANY template that needs math operations
|
|
|
|
PARAM expression AS string LIKE "2 + 2"
|
|
DESCRIPTION "Calculate mathematical expressions, conversions, and formulas"
|
|
|
|
REM Validate input
|
|
IF NOT expression OR expression = "" THEN
|
|
TALK "❌ Please provide a mathematical expression"
|
|
TALK "💡 Examples: '2 + 2', '10 * 5', '100 / 4', 'sqrt(16)', 'sin(45)'"
|
|
RETURN NULL
|
|
END IF
|
|
|
|
TALK "🧮 Calculating: " + expression
|
|
|
|
REM Create result object
|
|
result = NEW OBJECT
|
|
result.expression = expression
|
|
result.timestamp = NOW()
|
|
|
|
REM Try to evaluate the expression
|
|
REM This is a simplified calculator - extend as needed
|
|
|
|
REM Remove spaces
|
|
expr = REPLACE(expression, " ", "")
|
|
|
|
REM Basic operations
|
|
IF INSTR(expr, "+") > 0 THEN
|
|
parts = SPLIT(expr, "+")
|
|
IF UBOUND(parts) = 2 THEN
|
|
num1 = VAL(parts[0])
|
|
num2 = VAL(parts[1])
|
|
answer = num1 + num2
|
|
result.answer = answer
|
|
result.operation = "addition"
|
|
END IF
|
|
|
|
ELSE IF INSTR(expr, "-") > 0 AND LEFT(expr, 1) <> "-" THEN
|
|
parts = SPLIT(expr, "-")
|
|
IF UBOUND(parts) = 2 THEN
|
|
num1 = VAL(parts[0])
|
|
num2 = VAL(parts[1])
|
|
answer = num1 - num2
|
|
result.answer = answer
|
|
result.operation = "subtraction"
|
|
END IF
|
|
|
|
ELSE IF INSTR(expr, "*") > 0 THEN
|
|
parts = SPLIT(expr, "*")
|
|
IF UBOUND(parts) = 2 THEN
|
|
num1 = VAL(parts[0])
|
|
num2 = VAL(parts[1])
|
|
answer = num1 * num2
|
|
result.answer = answer
|
|
result.operation = "multiplication"
|
|
END IF
|
|
|
|
ELSE IF INSTR(expr, "/") > 0 THEN
|
|
parts = SPLIT(expr, "/")
|
|
IF UBOUND(parts) = 2 THEN
|
|
num1 = VAL(parts[0])
|
|
num2 = VAL(parts[1])
|
|
IF num2 <> 0 THEN
|
|
answer = num1 / num2
|
|
result.answer = answer
|
|
result.operation = "division"
|
|
ELSE
|
|
TALK "❌ Error: Division by zero"
|
|
RETURN NULL
|
|
END IF
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "sqrt") > 0 THEN
|
|
REM Square root
|
|
start_pos = INSTR(LCASE(expr), "sqrt(") + 5
|
|
end_pos = INSTR(start_pos, expr, ")")
|
|
IF end_pos > start_pos THEN
|
|
num_str = MID(expr, start_pos, end_pos - start_pos)
|
|
num = VAL(num_str)
|
|
IF num >= 0 THEN
|
|
answer = SQR(num)
|
|
result.answer = answer
|
|
result.operation = "square root"
|
|
ELSE
|
|
TALK "❌ Error: Cannot calculate square root of negative number"
|
|
RETURN NULL
|
|
END IF
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "pow") > 0 OR INSTR(expr, "^") > 0 THEN
|
|
REM Power operation
|
|
IF INSTR(expr, "^") > 0 THEN
|
|
parts = SPLIT(expr, "^")
|
|
IF UBOUND(parts) = 2 THEN
|
|
base = VAL(parts[0])
|
|
exponent = VAL(parts[1])
|
|
answer = base ^ exponent
|
|
result.answer = answer
|
|
result.operation = "power"
|
|
END IF
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "abs") > 0 THEN
|
|
REM Absolute value
|
|
start_pos = INSTR(LCASE(expr), "abs(") + 4
|
|
end_pos = INSTR(start_pos, expr, ")")
|
|
IF end_pos > start_pos THEN
|
|
num_str = MID(expr, start_pos, end_pos - start_pos)
|
|
num = VAL(num_str)
|
|
answer = ABS(num)
|
|
result.answer = answer
|
|
result.operation = "absolute value"
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "round") > 0 THEN
|
|
REM Rounding
|
|
start_pos = INSTR(LCASE(expr), "round(") + 6
|
|
end_pos = INSTR(start_pos, expr, ")")
|
|
IF end_pos > start_pos THEN
|
|
num_str = MID(expr, start_pos, end_pos - start_pos)
|
|
num = VAL(num_str)
|
|
answer = ROUND(num, 0)
|
|
result.answer = answer
|
|
result.operation = "rounding"
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "ceil") > 0 THEN
|
|
REM Ceiling
|
|
start_pos = INSTR(LCASE(expr), "ceil(") + 5
|
|
end_pos = INSTR(start_pos, expr, ")")
|
|
IF end_pos > start_pos THEN
|
|
num_str = MID(expr, start_pos, end_pos - start_pos)
|
|
num = VAL(num_str)
|
|
answer = INT(num)
|
|
IF num > answer THEN
|
|
answer = answer + 1
|
|
END IF
|
|
result.answer = answer
|
|
result.operation = "ceiling"
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "floor") > 0 THEN
|
|
REM Floor
|
|
start_pos = INSTR(LCASE(expr), "floor(") + 6
|
|
end_pos = INSTR(start_pos, expr, ")")
|
|
IF end_pos > start_pos THEN
|
|
num_str = MID(expr, start_pos, end_pos - start_pos)
|
|
num = VAL(num_str)
|
|
answer = INT(num)
|
|
result.answer = answer
|
|
result.operation = "floor"
|
|
END IF
|
|
|
|
ELSE IF INSTR(LCASE(expr), "percent") > 0 OR INSTR(expr, "%") > 0 THEN
|
|
REM Percentage calculation
|
|
REM Format: "20% of 100" or "20 percent of 100"
|
|
expr_lower = LCASE(expr)
|
|
|
|
IF INSTR(expr_lower, "of") > 0 THEN
|
|
REM Extract percentage and base number
|
|
of_pos = INSTR(expr_lower, "of")
|
|
percent_part = LEFT(expr, of_pos - 1)
|
|
percent_part = REPLACE(percent_part, "%", "")
|
|
percent_part = REPLACE(LCASE(percent_part), "percent", "")
|
|
percent_val = VAL(TRIM(percent_part))
|
|
|
|
base_part = MID(expr, of_pos + 2)
|
|
base_val = VAL(TRIM(base_part))
|
|
|
|
answer = (percent_val / 100) * base_val
|
|
result.answer = answer
|
|
result.operation = "percentage"
|
|
result.details = percent_val + "% of " + base_val + " = " + answer
|
|
END IF
|
|
|
|
ELSE
|
|
REM Try direct evaluation (single number)
|
|
answer = VAL(expr)
|
|
result.answer = answer
|
|
result.operation = "direct value"
|
|
END IF
|
|
|
|
REM Display result
|
|
IF result.answer <> NULL THEN
|
|
TALK "✅ Result: " + result.answer
|
|
TALK ""
|
|
TALK "📊 Details:"
|
|
TALK "Expression: " + expression
|
|
TALK "Operation: " + result.operation
|
|
TALK "Answer: " + result.answer
|
|
|
|
IF result.details THEN
|
|
TALK result.details
|
|
END IF
|
|
|
|
RETURN result
|
|
ELSE
|
|
TALK "❌ Could not calculate expression"
|
|
TALK ""
|
|
TALK "💡 Supported operations:"
|
|
TALK "• Basic: + - * /"
|
|
TALK "• Power: 2^3 or pow(2,3)"
|
|
TALK "• Square root: sqrt(16)"
|
|
TALK "• Absolute: abs(-5)"
|
|
TALK "• Rounding: round(3.7), ceil(3.2), floor(3.9)"
|
|
TALK "• Percentage: 20% of 100"
|
|
TALK ""
|
|
TALK "Examples:"
|
|
TALK "• 15 + 25"
|
|
TALK "• 100 / 4"
|
|
TALK "• sqrt(144)"
|
|
TALK "• 2^10"
|
|
TALK "• 15% of 200"
|
|
|
|
RETURN NULL
|
|
END IF
|