Graal Forums  

Go Back   Graal Forums > Development Forums > NPC Scripting > Code Gallery
FAQ Members List Calendar Today's Posts

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 08-07-2009, 01:48 AM
xXziroXx xXziroXx is offline
Malorian
xXziroXx's Avatar
Join Date: May 2004
Posts: 5,289
xXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant futurexXziroXx has a brilliant future
Staff Announcements/Messages

This is a tool to send staff members either global or private messages, that will be auto-PM'ed within 30 seconds when they logon RC, or straight away if they're already on RC.

Feedback appreciated!


Configuration:

You need to add the following code to your Control-NPC:

PHP Code:
function onRCChat(command)
{
  switch (
command) {
    case 
"staffmessage":
      
// --- Strings/Variables ---------------------------
      
temp.reciever params[1];  // Reciever(s) of message
                                  // account, or 'all'
      
temp.message  params[2];  // Message
      
temp.title    params[3];  // Title of message
      // -------------------------------------------------
      
      // Did we recieve the correct parameters?
      
if (params.size() != 4) {
        echo(
"[" name "]: Incorrect amount of parameters submitted for \"staffmessage\"");
        break;
      }
      
      
RCTracker.addMessage(reciever == "all" "_all_" recievermessagetitle);
    break;
  }

And make a new database NPC containing this code:

PHP Code:
function onInitialized()
  
onCreated();

function 
onCreated()
{
  
// --- Strings/Variables ---------------------------
  
enum {
    
// SQLite table
    
TABLE "rc_tracker",
    
// PM header
    
HEADER "=== Maloria Staff Announcement ===\n" @
             
"This is an automated message relay system.\n" @
             
"You have new message(s)!\n" @
             
"=====================\n",
    
// PM footer
    
FOOTER "------------------------"
  
};
  
temp.online_rcs "";  // Currently online RC's
  // -------------------------------------------------
  
  
join("functions_sql");
  
  
// Is the SQLite database up-to-date?
  
initializeDatabase();
  
onTimeOut();
}

function 
onTimeOut()
{
  
// --- Strings/Variables ---------------------------
  
temp.online_rcs "";  // Currently online RC's
  // -------------------------------------------------
  
  
online_rcs findRCs();
  
// Is there any new messages for anyone?
  
checkForUpdates(online_rcs);
  
setTimer(30);
}

function 
initializeDatabase()

  
// --- Strings/Variables ---------------------------
  
temp.query "";  // SQLite query
  // -------------------------------------------------
  
  // Does the table exist?
  
query getSQL("SELECT * FROM" SPC TABLE);
  if (
query.rows.size() == 0) {
    
// Creation of table
    
echo("[" name "] Creating SQLite table \"" TABLE "\"...");
    
getSQL("CREATE TABLE" SPC TABLE SPC "(rowid INTEGER PRIMARY KEY AUTOINCREMENT, account VARCHAR NOT NULL, message VARCHAR, title VARCHAR, sender VARCHAR, time_creation INTEGER, time_read INTEGER DEFAULT 0, readCount INTEGER DEFAULT 0, receivers VARCHAR)");
  }
}

public function 
findRCs(account)
{
  
// --- Params --------------------------------------
  // account (optional) - returns RC object if online,
  //                      false if not
  // -------------------------------------------------
  // --- Strings/Variables ---------------------------
  
temp.pl "";       // Current player object
  
temp.rcs = new[0];  // List of online RC's
  // -------------------------------------------------
  
  
for (plallplayers) {
    if (
pl.level.name "") {
      
// Checking for submitted 'account'...
      
if (account != "" && pl.account == account)
        return 
pl;
      
// No 'account' submitted, let's return all RC's...
      
else
        
rcs.add(pl.account);
    }
  }
  
  
// 'account' not online!
  
if (account != "")
    return 
false;
  
// list of RC's
  
else
    return 
rcs;
}

function 
checkForUpdates(accounts)
{
  
// --- Params --------------------------------------
  // accounts   - account(s) to check for new messages
  //              for
  // -------------------------------------------------
  // --- Strings/Variables ---------------------------
  
temp.account         "";  // Current processed account
  
temp.query           "";  // Current processed SQLite query
  
temp.row             "";  // Current processed query row
  
temp.unread_messages "";  // Number of unread messages
  
temp.headerSent      "";  // Checking if header has been sent or not
  
temp.receivers       "";  // Temporary modified 'receivers'
  // -------------------------------------------------
  
  // Let's transform 'accounts' to an array if it's only one
  // account.
  
if (accounts.size() == 0)
    
accounts = { accounts };  
  
  for (
accountaccounts) {     
    
query getSQL("SELECT * FROM" SPC TABLE SPC "WHERE account='_all_'");
    
    
// Do we need to fetch a 'global' message?
    
for (rowquery.rows) {
      
// Have 'account' fetched this one?
      
if (account in row.receivers)
        continue;
      
      
// Send the message to 'account'
      
getSQL("INSERT INTO" SPC TABLE SPC "(account, message, title, sender, time_creation) VALUES ('" account "', '" row.message.escape() @ "', '" row.title.escape() @ "', '" row.sender "', " int(timevar2) @ ")");
      
receivers row.receivers;
      
receivers.add(account);
      
// Update receivers of this message
      
getSQL("UPDATE" SPC TABLE SPC "SET receivers='" receivers "' WHERE rowid=" row.rowid);
    }
    
    
// How many unread messages does 'account' have?
    
query getSQL("SELECT * FROM" SPC TABLE SPC "WHERE account='" account "' AND time_read=0");
    
unread_messages query.rows.size();
    
// Let's query messages for 'account'!
    
query getSQL("SELECT * FROM" SPC TABLE SPC "WHERE account='" account "'");
    
//echo("Number of messages for" SPC account @ ":" SPC query.rows.size() SPC "(" @ unread_messages SPC "new)");
    
    // Change layout depending on the above result
    
for (rowquery.rows) {
      
// Is this message already read?
      
if (row.readCount >= 1)
        continue;
      
      
// Do we need to send one, or several messages?
      
if (unread_messages 1) {
        
// Send the header once...
        
if (!headerSent) {
          
findRCs(account).sendPM(HEADER);
          
headerSent true;
        }
        
// And then the messages!
        
sendMessage(row.rowidfalsetrue);
      }
      else
        
sendMessage(row.rowidtrue);
    }
  }
}

public function 
addMessage(accounttxttitle)
{
  
// --- Params --------------------------------------
  // account    - account that will retrieve the message
  // txt        - message
  // title      - title of message
  // -------------------------------------------------
  // --- Strings/Variables ---------------------------
  
temp.query      "";  // SQLite query
  
temp.row        "";  // current query row
  
temp.sender     "";  // Account of person who sent message
  
temp.new_index  "";  // Next column index
  
temp.online_rcs "";  // Currently online RC's
  // -------------------------------------------------
  
  // SQLite query
  
query getSQL("SELECT * FROM" SPC TABLE);
  
// Next column index would be...
  
new_index query.rows[query.rows.size()-1].rowid 1;
  
  
  
// Who sent this message?
  
if (player.account == "")
    
sender "(npcserver)";
  else
    
sender player.account;
  
  
// Insert message into SQLite table
  
getSQL("INSERT INTO" SPC TABLE SPC "(account, message, title, sender, time_creation) VALUES ('" account "', '" txt.escape() @ "', '" title.escape() @ "', '" sender "', " int(timevar2) @ ")");
  
  
// Is the recipient online?
  
online_rcs findRCs();
  if (
account in online_rcs)
    
sendMessage(new_indextrue);
  else if (
account == "_all_")
    
checkForUpdates(online_rcs);
}

function 
sendMessage(msg_indexheaderfooter)
{
  
// --- Params --------------------------------------
  // msg_index  - what rowid will we query?
  // header     - send header? true/false
  // footer     - send footer? true/false
  // -------------------------------------------------
  // --- Strings/Variables ---------------------------
  
temp.query   "";  // SQLite query
  
temp.account "";  // RC object
  // -------------------------------------------------
  
  
  
query getSQL("SELECT * FROM" SPC TABLE SPC "WHERE rowid=" msg_index);
  
temp.account findRCs(query.account);
  
  
// Abort if recipient is offline
  
if (account == false)
    return echo(
"[" name "]: PM aborted," SPC query.account SPC "not online!");
  
  
// Header
  
if (header)
    
account.sendPM(HEADER);
  
// Message
  
account.sendPM("Sender:" SPC query.sender "\nTitle:" SPC query.title "\nMessage:\n" query.message);
  
// Footer
  
if (footer)
    
account.sendPM(FOOTER);
  
  
// Mark message as read
  
getSQL("UPDATE" SPC TABLE SPC "SET time_read=" int(timevar2) @ ", readCount=" query.readCount 1 SPC "WHERE rowid=" query.rowid);

And finally, you need to create a class called functions_sql and add this function to it:

PHP Code:
function getSQL(query)
{
  
temp.req requestSQL(querytrue);
  if (!
temp.req.completed)//&& !waitfor(temp.req, "onReceiveData", 1))
    
return NULL;
  
  if (
temp.req.error != "")
    echo(
temp.req.error);
  
  return 
temp.req;

Usage:

PHP Code:
/npc sendmessage account message title 
PHP Code:
By RC chat: /npc sendmessage xXziroXx "You need to start working on this, and later on that.\n\nAnd dont you dare slacking!" "Work Assignment"

By scriptaddMessage("xXziroXx""You need to start working on this, and later on that.\n\nAnd dont you dare slacking!" "Work Assignment"); 
Instead of providing an account, you can simply type "all" and it will be sent to all the staff members.
__________________
Follow my work on social media post-Graal:Updated august 2025.
Reply With Quote
  #2  
Old 08-07-2009, 02:12 AM
cbk1994 cbk1994 is offline
the fake one
cbk1994's Avatar
Join Date: Mar 2003
Location: San Francisco
Posts: 10,718
cbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond reputecbk1994 has a reputation beyond repute
Send a message via AIM to cbk1994
Looks handy, but why not just use the PRAGMA command to tell if the table exists, rather than sending a query that will just cause an error if there is no table?
__________________
Reply With Quote
  #3  
Old 10-30-2009, 06:39 PM
sssssssssss sssssssssss is offline
Cyril Rain
sssssssssss's Avatar
Join Date: May 2003
Location: Texas, USA
Posts: 1,134
sssssssssss will become famous soon enough
Quote:
[db_staffcontrol] Creating SQLite table "rc_tracker"...
Then it never says anything else. Is there a certain name the dbnpc needs to be?

Uploaded everything exactly besides the dbnpc name, didn't say that it mattered.

but no pm is being sent when using the correct format
__________________
Cyril Rain
Creator and leader of SLX
Admin of Elysium
Elysium's Facebook Page: http://facebook.com/GraalOnlineElysium
Graal Forum Thread: http://forums.graalonline.com...
Graalians Thread: http://www.graalians.com...


Reply With Quote
  #4  
Old 11-01-2009, 03:01 AM
Switch Switch is offline
o.o
Switch's Avatar
Join Date: Jan 2007
Location: Philadelphia
Posts: 3,038
Switch has a spectacular aura about
Send a message via MSN to Switch
RCTracker
__________________
Oh squiggly line in my eye fluid. I see you lurking there on the peripheral of my vision.
But when I try to look at you, you scurry away.
Are you shy, squiggly line?
Why only when I ignore you, do you return to the center of my eye?
Oh, squiggly line, it's alright, you are forgiven.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 04:13 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.