<?php
 
 
 
// error messages (just so its easy to change or translate)
 
define('RS_WRONG_USERNAME_OR_PASSWORD', 'Wrong username or password');
 
define('RS_LOGIN_BEFORE_POSTING', 'You need to login before posting');
 
define('RS_NO_ROOMS', 'No chat rooms are available');
 
define('RS_NO_ROOM', 'This room is not available');
 
 
 
class rschat
 
{
 
    private $db; // database object. class type is mysql
 
    protected $user_conf = array(); // user configuration. fetched after authentication
 
    
 
    private $logged_in = false; // are we logged in or not?
 
    
 
    protected $rooms = array(); // room list
 
    
 
    // constructor. (mysql) $db
 
    public function __construct(mysql $db)
 
    {
 
        $this->db = $db;
 
    }
 
    
 
    // authentication function. (string) $user, (string) $pass
 
    public function login($user, $pass)
 
    {
 
        // log user out in case already logged in
 
        $this->user_conf = array();
 
        $this->logged_in = false;
 
        
 
        // try to authenticate
 
        $auth = $this->db->query("select * from users where username='" . mysql_real_escape_string($user) . "' and password=PASSWORD('" . mysql_real_escape_string($pass) . "') limit 1");
 
        if (count($auth) > 0)
 
        { // good. username and password are correct
 
            // set variables
 
            $this->user_conf['username'] = $auth[0]['username'];
 
            $this->user_conf['id'] = $auth[0]['id'];
 
            $this->user_conf['msg_format'] = array // message formatting
 
            (
 
                'color'    =>    $auth[0]['msg_color'],
 
                'italic'    =>    $auth[0]['msg_italic'] === 'y' ? true : false,
 
                'bold'    =>    $auth[0]['msg_bold'] === 'y' ? true : false
 
            );
 
            
 
            $this->logged_in = true;
 
            return true;
 
        } else { // bad. something is incorrect in user input
 
            $this->logged_in = false;
 
            return RS_WRONG_USERNAME_OR_PASSWORD;
 
        }
 
    }
 
    
 
    // get rooms list. if $force is set to true then we will grab it from database
 
    // even if we did that already. (bool) $force
 
    public function get_rooms($force = false)
 
    {
 
        if (count($this->rooms) < 1 || $force)
 
        {
 
            $rooms = $this->db->query("select * from rooms order by name");
 
            if (count($rooms) > 0)
 
            {
 
                $this->rooms = $rooms;
 
                return $rooms;
 
            } else {
 
                return RS_NO_ROOMS;
 
            }
 
        }
 
    }
 
    
 
    // check if room exists. (int) $room
 
    public function check_room($room)
 
    {
 
        $rooms = $this->get_rooms(true);
 
        if (is_array($rooms) && count($rooms) > 0)
 
        {
 
            foreach($rooms as $n => $v)
 
            {
 
                if ($room === $v['id'])
 
                {
 
                    return true;
 
                }
 
            }
 
            
 
            return RS_NO_ROOM;
 
        } else {
 
            return RS_NO_ROOMS;
 
        }
 
    }
 
    
 
    // this function sends message to chat room. (int) $room, (string) $message
 
    public function say($room, $message)
 
    {
 
        // are we logged in?
 
        if ($this->logged_in)
 
        {
 
            // check if room actually exists
 
            $room_exists = $this->check_room($room);
 
            if ($room_exists === true)
 
            {
 
                // format and post message
 
                $bold_start = $this->user_conf['msg_format']['bold'] ? '<strong>' : '';
 
                $bold_end = $this->user_conf['msg_format']['bold'] ? '</strong>' : '';
 
                $italic_start = $this->user_conf['msg_format']['italic'] ? '<em>' : '';
 
                $italic_end = $this->user_conf['msg_format']['italic'] ? '</em>' : '';
 
                
 
                $message = '<font color="' . $this->user_conf['msg_format']['color'] . '">' . $bold_start . $italic_start . $message . $italic_end . $bold_end . '</font>';
 
                
 
                $this->db->query("insert into messages (room, user, message) values (" . (int) $room . ", " . (int) $this->user_conf['id'] . ", '" . mysql_real_escape_string($message) . "')");
 
            } else {
 
                return $room_exists;
 
            }
 
        } else {
 
            return RS_LOGIN_BEFORE_POSTING;
 
        }
 
    }
 
    
 
    // get messages from specific room. (int) $room, (int) $last_message_id
 
    public function get_messages($room, $last_message_id)
 
    {
 
        $room_exists = $this->check_room($room);
 
        if ($room_exists === true)
 
        {
 
            $messages = $this->db->query("select m.id, m.message, r.name, u.username from messages as m, users as u, rooms as r where m.room=r.id and m.user=u.id and m.id>" . (int) $last_message_id . " and m.room=" . (int) $room . " order by m.id");
 
            return array
 
            (
 
                'last_message_id'    =>    $messages[count($messages) - 1]['id'],
 
                'messages'    =>    $messages
 
            );
 
        } else {
 
            return $room_exists;
 
        }
 
    }
 
}
 
 
 
?>
 
 |