• 04-05-2015, 12:15:03
    #1
    Kurumsal Üye
    Merhaba,

    Sitemde kullandığım bir modüle ait kod Türkçe karakterleri metin içerisinden siliyor. Kodu aşağıda ekliyorum.

    Düzeltilmesi konusunda yardımcı olabilecek bir arkadaş varsa memnun olurum.

    $message = unhtmlspecialchars(str_replace(array("\n"), '', trim(convert_urlencoded_unicode($message))));
  • 04-05-2015, 12:33:28
    #2
    Üyeliği durduruldu
    Onurss adlı üyeden alıntı: mesajı görüntüle
    Merhaba,

    Sitemde kullandığım bir modüle ait kod Türkçe karakterleri metin içerisinden siliyor. Kodu aşağıda ekliyorum.

    Düzeltilmesi konusunda yardımcı olabilecek bir arkadaş varsa memnun olurum.

    $message = unhtmlspecialchars(str_replace(array("\n"), '', trim(convert_urlencoded_unicode($message))));
    unhtmlspecialchars fonksiyonunu paylaşırmısın
  • 04-05-2015, 12:57:25
    #3
    Kurumsal Üye
    dem_baba adlı üyeden alıntı: mesajı görüntüle
    unhtmlspecialchars fonksiyonunu paylaşırmısın
    Dosyayı kontrol ettim ancak bu fonksiyona ait bir tanımlama bulamadım. Standart bir fonksiyon olabilir mi ?
  • 04-05-2015, 13:01:24
    #4
    Üyeliği durduruldu
    php de böyle bir komut yok.
  • 04-05-2015, 18:41:26
    #5
    Kurumsal Üye
    dem_baba adlı üyeden alıntı: mesajı görüntüle
    php de böyle bir komut yok.
    Find and Replace proğramı ile modülün tüm dosyalarını tarattım ama kayda değer birşey çıkmadı. Başka nereden olabilir acaba ?
  • 04-05-2015, 18:44:15
    #6
    Üyeliği durduruldu
    bu fonksiyonun olduğu dosyayı paylaşırmısın
  • 05-05-2015, 17:46:03
    #7
    Kurumsal Üye
    dem_baba adlı üyeden alıntı: mesajı görüntüle
    bu fonksiyonun olduğu dosyayı paylaşırmısın
    <?php
    
    if (!class_exists('vB_DataManager', false))
    {
    	exit;
    }
    
    class vBShout_DataManager_Shout extends vB_DataManager
    {
    	var $validfields = array(
    		'shoutid' 		=> array(TYPE_UINT,       REQ_INCR, VF_METHOD, 'verify_nonzero'),
    		'userid' 		=> array(TYPE_INT,        REQ_AUTO),
    		'dateline' 		=> array(TYPE_UNIXTIME,   REQ_AUTO),
    		'message' 		=> array(TYPE_STR,        REQ_YES,	VF_METHOD),
    		'message_raw'	=> array(TYPE_STR,        REQ_YES),
    		'type' 			=> array(TYPE_UINT,       REQ_AUTO),
    		'id' 			=> array(TYPE_INT,        REQ_NO),
    		'notification' 	=> array(TYPE_STR,        REQ_NO,	'if (!in_array($data, array(\'\', \'thread\', \'reply\'))) { return false; } return true;'),
    		'forumid' 		=> array(TYPE_INT,        REQ_NO, 	VF_METHOD),
    		'instanceid' 	=> array(TYPE_INT,        REQ_NO, 	VF_METHOD),
    		'chatroomid' 	=> array(TYPE_INT,        REQ_NO, 	VF_METHOD),
    		'allowsmilie'   => array(TYPE_UINT,       REQ_NO),
    	);
    	
    	/**
    	* The main table this class deals with
    	*
    	* @var	string
    	*/
    	var $table = 'dbtech_vbshout_shout';
    	var $condition_construct = array('shoutid = %1$d', 'shoutid');
    	var $hook_start = 'dbtech_vbshout_data_start';
    	var $hook_delete = 'dbtech_vbshout_data_delete';
    	function vBShout_DataManager_Shout(&$registry, $errtype = ERRTYPE_ARRAY)
    	{
    		parent::vB_DataManager($registry, $errtype);
    	}
    	function verify_message(&$message)
    	{
    		$message = unhtmlspecialchars(str_replace(array("\n"), '', trim(convert_urlencoded_unicode($message))));
    
    		if ($this->info['instance']['options']['maxchars'] AND !VBSHOUT::$permissions['ismanager'])
    		{
    			$message = substr($message, 0, $this->info['instance']['options']['maxchars']);
    		}
    
    		if (empty($message))
    		{
    			$this->error('dbtech_vbshout_invalid_message_specified');			
    			return false;
    		}
    		
    		// Strip out some characters we can't deal with
    		$message = preg_replace('/[\x00-\x1F]/', '', $message);
    
    		if ($this->info['instance']['options']['allcaps'])
    		{
    			// Grab the noshout text
    			require_once(DIR . '/includes/functions_newpost.php');
    			$message = fetch_no_shouting_text($message);
    		}
    		
    		return true;
    	}
    
    	function verify_forumid(&$forumid)
    	{
    		if ($forumid === 0)
    		{
    			// Forumid 0 is valid
    			return true;
    		}
    		
    		if (!$this->registry->forumcache["$forumid"])
    		{
    			$this->error('invalid_forum_specified');
    			return false;
    		}
    		return true;
    	}
    
    	/**
    	* Verifies that an instance exists and is valid
    	*
    	* @param	integer	The instance id
    	*
    	* @return	boolean
    	*/
    	function verify_instanceid(&$instanceid)
    	{
    		if ($instanceid === 0)
    		{
    			// 0 is a valid instance
    			return true;
    		}
    		
    		if (!VBSHOUT::$cache['instance']["$instanceid"])
    		{
    			$this->error('dbtech_vbshout_invalid_instanceid_specified');
    			return false;
    		}
    		return true;
    	}
    
    	/**
    	* Verifies that an image filename prefix is valid
    	*
    	* @param	string	The image prefix filename
    	*
    	* @return	boolean
    	*/
    	function verify_chatroomid(&$chatroomid)
    	{
    		if ($chatroomid === 0)
    		{
    			// 0 is a valid chat room
    			return true;
    		}
    		
    		if (!VBSHOUT::$cache['chatroom']["$chatroomid"])
    		{
    			$this->error('dbtech_vbshout_invalid_chatroomid_specified');
    			return false;
    		}
    		return true;
    	}
    
    
    	/**
    	* Anonymises links if needed
    	*
    	* @return	string
    	*/
    	function anonymiseLinks($message)
    	{
    		// Define our URL patterns
    		$patterns = array(
    			'#\[url="([a-zA-Z]+[://]+[A-Za-z0-9\-_]+\\.+[A-Za-z0-9\./%&=\?\-_]+)"\](.*)\[/url\]#isU',
    			'#\[url=([a-zA-Z]+[://]+[A-Za-z0-9\-_]+\\.+[A-Za-z0-9\./%&=\?\-_]+)\](.*)\[/url\]#isU',
    			'#\[url\](.*)\[/url\]#isU'
    		);
    
    		// Call the replacement
    		return preg_replace_callback($patterns, array($this, '_anonymiseLinksCallback'), $message);
    	}
    
    	/**
    	* Callback for anonymiser
    	*
    	* @return	string
    	*/
    	function _anonymiseLinksCallback($matches)
    	{
    		if (
    			strpos($matches[1], 'anonym.to') === false AND
    			strpos($matches[1], parse_url($this->registry->options['bburl'], PHP_URL_HOST)) === false
    		)
    		{
    			// Do the replacement
    			$matches[0] = str_ireplace($matches[1], 'http://www.anonym.to/?' . $matches[1], $matches[0]);
    		}
    
    		return $matches[0];
    	}
    
    	/**
    	* Checks for various chat commands that may interrupt saving
    	*
    	* @return	boolean
    	*/
    	function parse_action_codes()
    	{
    		global $vbphrase;		
    		
    		if ($this->fetch_field('type') != VBSHOUT::$shouttypes['shout'])
    		{
    			// We're not doing anything with a non-shout type
    			// Notifications / PMs are already parsed and ready
    			return true;
    		}
    		
    		$instanceid = $this->fetch_field('instanceid');
    		$this->info['instance'] = (!$this->info['instance'] ? VBSHOUT::$cache['instance']["$instanceid"] : $this->info['instance']);
    		
    		// The PM command is special and can't be prettified.
    		// It's also the only 3-stage command we have, so it doesn't matter
    		if (preg_match("#^(\/pm)\s+?(.+?);\s+?(.+?)$#i", $this->fetch_field('message'), $matches))
    		{
    			if (!$this->info['instance']['permissions_parsed']['canpm'])
    			{
    				// We has an error
    				$this->error('dbtech_vbshout_pming_disabled_usergroup');
    				return false;
    			}
    			
    			if ($matches[2] == $this->registry->userinfo['username'])
    			{
    				// We has an error
    				$this->error('dbtech_vbshout_cannot_pm_self');
    				return false;
    			}
    			
    			if (!$exists = $this->registry->db->query_first_slave("
    				SELECT userid, dbtech_vbshout_settings
    				FROM " . TABLE_PREFIX . "user
    				WHERE username = " . $this->registry->db->sql_prepare(htmlspecialchars_uni($matches[2]))
    			))
    			{
    				// We has an error
    				$this->error('dbtech_vbshout_invalid_user');
    				return false;
    			}
    			
    			$return_value = true;
    			
    			
    			($hook = vBulletinHook::fetch_hook('dbtech_vbshout_parsecommand_pm')) ? eval($hook) : false;
    	
    			if (!$return_value)
    			{
    				// We're ending it early
    				return $return_value;
    			}
    			
    			// Override some values
    			$this->set('id', 			$exists['userid']);
    			$this->set('type', 			VBSHOUT::$shouttypes['pm']);
    			$this->set('message', 		$matches[3]);
    			$this->set('chatroomid', 	0);
    		}
    		else if (preg_match("#^(\/[a-z0-9]*?)$#i", $this->fetch_field('message'), $matches))
    		{
    			// 1-stage command
    			switch ($matches[1])
    			{
    				case '/prune':
    					
    					if (!$this->fetch_field('chatroomid'))
    					{
    						if (!$this->info['instance']['permissions_parsed']['canprune'])
    						{
    							// We has an error
    							$this->error('dbtech_vbshout_cannot_prune');
    							return false;
    						}
    					}
    					else
    					{
    						if (VBSHOUT::$cache['chatroom']["{$this->fetch_field(chatroomid)}"]['creator'] != $this->registry->userinfo['userid'] AND !$this->info['instance']['permissions_parsed']['canprune'])
    						{
    							// Only chat room creators can prune
    							$this->error('dbtech_vbshout_cannot_prune');
    							return false;
    						}
    					}
    					
    					// Now get rid of the shouts
    					$this->registry->db->query_write("
    						DELETE FROM " . TABLE_PREFIX . "dbtech_vbshout_shout
    						WHERE `instanceid` = " . intval($this->fetch_field('instanceid')) . "
    							AND `chatroomid` = " . intval($this->fetch_field('chatroomid')) . "
    					");
    					
    					// Rebuild shout counts
    					VBSHOUT::build_shouts_counter();
    					
    					// Log the prune command
    					VBSHOUT::log_command('prune');
    					
    					// Blank out the message and change type
    					$this->set('type', 		VBSHOUT::$shouttypes['system']);
    					$this->set('message', 	$vbphrase['dbtech_vbshout_shoutbox_pruned']);
    					if (!$this->info['instance']['permissions_parsed']['showaction'])
    					{
    						// We're not showing action
    						$this->set('userid', 	-1);
    					}
    					break;
    				
    				case '/editsticky':
    					if (!$this->info['instance']['permissions_parsed']['cansticky'])
    					{
    						$this->error('dbtech_vbshout_cannot_sticky');
    						return false;
    					}
    					
    					// What we need to put in the editor
    					VBSHOUT::$fetched['editor'] = '/sticky ' . $this->info['instance']['sticky_raw'];
    					
    					// We're not continuing
    					return false;
    					break;
    					
    				case '/createchat':
    					$this->error('dbtech_vbshout_invalid_chatroom_name');
    					return false;
    					break;
    					
    				case '/resetshouts':
    					if (!$this->fetch_field('chatroomid'))
    					{
    						if (!$this->info['instance']['permissions_parsed']['canprune'])
    						{
    							// We has an error
    							$this->error('dbtech_vbshout_cannot_prune');
    							return false;
    						}
    					}
    					else
    					{
    						if (VBSHOUT::$cache['chatroom']["{$this->fetch_field(chatroomid)}"]['creator'] != $this->registry->userinfo['userid'] AND !$this->info['instance']['permissions_parsed']['canprune'])
    						{
    							// Only chat room creators can prune
    							$this->error('dbtech_vbshout_cannot_prune');
    							return false;
    						}
    					}
    
    					// Reset all users' lifetime shouts
    					VBSHOUT::$db->query('UPDATE $user SET dbtech_vbshout_shouts_lifetime = dbtech_vbshout_shouts', array(), 'query_write');
    					
    					// Log the removesticky command
    					VBSHOUT::log_command('resetshouts');
    
    					// Blank out the message and change type
    					$this->set('type', 		VBSHOUT::$shouttypes['system']);
    					$this->set('message', 	$vbphrase['dbtech_vbshout_shouts_reset']);
    					if (!$this->info['instance']['permissions_parsed']['showaction'])
    					{
    						// We're not showing action
    						$this->set('userid', 	-1);
    					}
    
    					break;
    					
    				case '/removenotice':
    				case '/removesticky':
    				case '/sticky':
    					if (!$this->info['instance']['permissions_parsed']['cansticky'])
    					{
    						$this->error('dbtech_vbshout_cannot_sticky');
    						return false;
    					}
    					
    					// Remove the sticky note
    					VBSHOUT::set_sticky('');
    					
    					// Log the removesticky command
    					VBSHOUT::log_command('removesticky');
    						
    						// Blank out the message
    					$this->set('type', 		VBSHOUT::$shouttypes['system']);
    					$this->set('message', 	$vbphrase['dbtech_vbshout_sticky_note_removed']);
    					if (!$this->info['instance']['permissions_parsed']['showaction'])
    					{
    						// We're not showing action
    						$this->set('userid', 	-1);
    					}
    					break;
    					
    				case '/banlist':
    					if (!$this->info['instance']['permissions_parsed']['canban'])
    					{
    						$this->error('dbtech_vbshout_cannot_ban');
    						return false;
    					}
    					
    					$users = VBSHOUT::$db->fetchAll('
    						SELECT
    							user.avatarid,
    							user.avatarrevision,
    							user.username,
    							user.usergroupid,
    							user.membergroupids,
    							user.infractiongroupid,
    							user.displaygroupid,
    							user.dbtech_vbshout_settings AS shoutsettings,
    							user.dbtech_vbshout_shoutstyle AS shoutstyle
    							:hookQuerySelect
    						FROM $user AS user
    						:hookQueryJoin
    						WHERE dbtech_vbshout_banned = ?
    					', array(
    						':hookQuerySelect' => 
    							($this->registry->options['avatarenabled'] ? '
    								, avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline, customavatar.width AS avwidth, customavatar.height AS avheight, customavatar.height_thumb AS avheight_thumb, customavatar.width_thumb AS avwidth_thumb, customavatar.filedata_thumb
    							' : '') .
    							($this->registry->products['dbtech_vbshop'] ? '
    								, user.dbtech_vbshop_purchase
    							' : '')		
    						,
    						':hookQueryJoin' =>
    							($this->registry->options['avatarenabled'] ? '
    								LEFT JOIN $avatar AS avatar ON (avatar.avatarid = user.avatarid)
    								LEFT JOIN $customavatar AS customavatar ON (customavatar.userid = user.userid)
    							' : '')
    						,
    						'1'
    					));
    					
    					$message = array();
    					foreach ($users as $user)
    					{
    						// Grab the markup username for this user
    						fetch_musername($user);
    						
    						if (VBSHOUT::$instance['options']['avatars_normal'] AND !((int)$this->registry->userinfo['dbtech_vbshout_settings'] & 262144) AND VBSHOUT::$isPro)
    						{
    							if (!function_exists('fetch_avatar_from_userinfo'))
    							{
    								// Get the avatar function
    								require_once(DIR . '/includes/functions_user.php');
    							}
    							
    							// grab avatar from userinfo
    							fetch_avatar_from_userinfo($user, true);
    							
    							$user['musername'] = '<img border="0" src="' . $user['avatarurl'] . '" alt="" width="' . VBSHOUT::$instance['options']['avatar_width_normal'] . '" height="' . VBSHOUT::$instance['options']['avatar_height_normal'] . '" /> ' . $user['musername'];
    						}
    						
    						// Store silenced user
    						$message[] = $user['musername'];			
    					}
    					
    					// Blank out the message and change type
    					$this->set('userid', 	$this->registry->userinfo['userid']);
    					$this->set('id', 		$this->registry->userinfo['userid']);
    					$this->set('type', 		VBSHOUT::$shouttypes['pm']);
    					$this->set('message', 	(count($message) ? implode(', ', $message) : $vbphrase['dbtech_vbshout_no_banned_users']));					
    					break;
    				
    				default:
    					$return_value = true;
    					$handled = false;
    
    					
    					
    					($hook = vBulletinHook::fetch_hook('dbtech_vbshout_command_1')) ? eval($hook) : false;
    					
    					if (!$handled)
    					{
    						// We didn't have any errors, we just returned false
    						//$this->error('dbtech_vbshout_invalid_command');
    						//return false;
    					}
    					return $return_value;
    					break;
    			}
    		}
    		else if (preg_match("#^(\/[a-z0-9]*?)\s(.+?)$#i", $this->fetch_field('message'), $matches))
    		{
    			// 2-stage command
    			switch ($matches[1])
    			{
    				case '/me':
    					// ZE ME COMMAND, IT DOEZ NOZING
    					break;
    					
    				case '/invite':
    				case '/chatinvite':
    					// Invite an user to chat
    					$chatroomid = $this->fetch_field('chatroomid');
    					
    					if (!$title = VBSHOUT::$cache['chatroom']["$chatroomid"]['title'] OR VBSHOUT::$cache['chatroom']["$chatroomid"]['membergroupids'])
    					{
    						$this->error('dbtech_vbshout_invalid_chat_room');
    						return false;
    					}
    					
    					if (!$userid = $this->registry->db->query_first_slave("SELECT userid FROM " . TABLE_PREFIX . "user WHERE username = " . $this->registry->db->sql_prepare(htmlspecialchars_uni($matches[2]))))
    					{
    						$this->error('dbtech_vbshout_invalid_user');
    						return false;
    					}
    					
    					// Invite to join the chat room
    					VBSHOUT::invite_chatroom(VBSHOUT::$cache['chatroom']["$chatroomid"], $userid['userid'], $this->registry->userinfo['userid']);
    
    					//$this->fetched['success'] = $vbphrase['dbtech_vbshout_chat_invited_successfully'];
    					
    					return false;
    					break;
    					
    				case '/ignore':
    				case '/unignore':
    					// Ignore an user
    					if (!$exists = $this->registry->db->query_first_slave("
    						SELECT userid, username, usergroupid, membergroupids
    						FROM " . TABLE_PREFIX . "user
    						WHERE username = " . $this->registry->db->sql_prepare(htmlspecialchars_uni($matches[2]))
    					))
    					{
    						// We has an error
    						$this->error('dbtech_vbshout_invalid_user');
    						return false;
    					}
    					
    					if ($exists['userid'] == $this->registry->userinfo['userid'])
    					{
    						// Ourselves, duh
    						$this->error('dbtech_vbshout_cannot_ignore_self');
    						return false;
    					}
    					
    					if (VBSHOUT::check_protected_usergroup($exists, true))
    					{
    						// We had an error
    						$this->error('dbtech_vbshout_protected_usergroup');
    						return false;
    					}
    					
    					if ($matches[1] == '/ignore')
    					{
    						// Ignore the user
    						$this->registry->db->query_write("
    							REPLACE INTO " . TABLE_PREFIX . "dbtech_vbshout_ignorelist
    								(userid, ignoreuserid)
    							VALUES (
    								" . intval($this->registry->userinfo['userid']) . ",
    								" . intval($exists['userid']) . "
    							)
    						");
    					}
    					else
    					{
    						// Unignore the user
    						$this->registry->db->query_write("
    							DELETE FROM " . TABLE_PREFIX . "dbtech_vbshout_ignorelist
    							WHERE userid = " . intval($this->registry->userinfo['userid']) . "
    								AND ignoreuserid = " . intval($exists['userid']) . "
    						");
    					}
    					// Print success message
    					//$this->fetched['success'] = construct_phrase($vbphrase['dbtech_vbshout_ignored_successfully'], $matches[2]);
    					//$this->fetched['success'] = construct_phrase($vbphrase['dbtech_vbshout_unignored_successfully'], $matches[2]);					
    					//$message = false;
    					return false;
    					break;
    					
    				case '/notice':
    				case '/setnotice':
    				case '/sticky':
    				case '/setsticky':
    					if (!$this->info['instance']['permissions_parsed']['cansticky'])
    					{
    						$this->error('dbtech_vbshout_cannot_sticky');
    						return false;
    					}
    					
    					// Set the sticky note
    					VBSHOUT::set_sticky($matches[2]);
    					
    					// Log the setsticky command
    					VBSHOUT::log_command('setsticky', $matches[2]);						
    					
    					// Blank out the message
    					$this->set('type', 		VBSHOUT::$shouttypes['system']);
    					$this->set('message', 	$vbphrase['dbtech_vbshout_sticky_note_set']);
    					if (!$this->info['instance']['permissions_parsed']['showaction'])
    					{
    						// We're not showing action
    						$this->set('userid', 	-1);
    					}
    					break;
    					
    				case '/ban':
    				case '/unban':				
    					if (!$this->info['instance']['permissions_parsed']['canban'])
    					{
    						$this->error('dbtech_vbshout_cannot_ban');
    						return false;
    					}
    					
    					// Banning an user
    					if (!$exists = $this->registry->db->query_first_slave("
    						SELECT userid, username, usergroupid, membergroupids
    						FROM " . TABLE_PREFIX . "user
    						WHERE username = " . $this->registry->db->sql_prepare(htmlspecialchars_uni($matches[2]))
    					))
    					{
    						// We has an error
    						$this->error('dbtech_vbshout_invalid_user');
    						return false;
    					}
    					
    					if ($exists['userid'] == $this->registry->userinfo['userid'])
    					{
    						// Ourselves, duh
    						$this->error('dbtech_vbshout_cannot_ban_self');
    						return false;
    					}
    					
    					if (VBSHOUT::check_protected_usergroup($exists, true))
    					{
    						// We had an error
    						$this->error('dbtech_vbshout_protected_usergroup');
    						return false;
    					}
    					
    					// Log the ban command
    					VBSHOUT::log_command(($matches[1] == '/ban' ? 'ban' : 'unban'), $exists['userid']);		
    					
    					// Ban the user
    					$this->registry->db->query_write("UPDATE " . TABLE_PREFIX . "user SET dbtech_vbshout_banned = " . ($matches[1] == '/ban' ? '1' : '0') . " WHERE userid = " . $this->registry->db->sql_prepare($exists['userid']));
    					
    					if ($this->info['instance']['permissions_parsed']['showaction'])
    					{					
    						// Print success message
    						$this->set('type', 		VBSHOUT::$shouttypes['system']);
    						$this->set('message', 	($matches[1] == '/ban' ? construct_phrase($vbphrase['dbtech_vbshout_banned_successfully'], $matches[2]) : construct_phrase($vbphrase['dbtech_vbshout_unbanned_successfully'], $matches[2])));
    					}
    					else
    					{
    						//$this->fetched['success'] = construct_phrase($vbphrase['dbtech_vbshout_banned_successfully'], $matches[2]);
    						//$this->fetched['success'] = construct_phrase($vbphrase['dbtech_vbshout_unbanned_successfully'], $matches[2]);
    						//$message = false;
    						return false;
    					}
    					break;
    					
    				case '/createchat':
    					if (!$this->info['instance']['permissions_parsed']['cancreatechat'])
    					{
    						$this->error('dbtech_vbshout_cant_create_chat');
    						return false;
    					}
    					
    					if ($this->info['instance']['options']['maxchats'])
    					{
    						$i = 0;
    						foreach ((array)VBSHOUT::$cache['chatroom'] as $chatroomid => $chatroom)
    						{
    							if (!$chatroom['active'])
    							{
    								// Don't count closed rooms
    								continue;
    							}
    							
    							if ($chatroom['creator'] == $this->registry->userinfo['userid'])
    							{
    								// We're the creator
    								$i++;
    							}
    						}
    						
    						if ($i >= $this->info['instance']['options']['maxchats'])
    						{
    							// Waaaay too many chats, slow down tiger!
    							$this->error('dbtech_vbshout_too_many_chats');							
    							return false;
    						}
    					}
    
    					// Grab the title
    					$title = $matches[2];
    					
    					// init data manager
    					$dm =& VBSHOUT::initDataManager('Chatroom', $this->registry, ERRTYPE_SILENT);
    						$dm->set('title', 		$title);
    						$dm->set('instanceid', 	$this->info['instance']['instanceid']);
    						$dm->set('creator', 	$this->registry->userinfo['userid']);
    						$dm->set('members', 	array($this->registry->userinfo['userid'] => '1'));
    					$chatroomid = $dm->save();
    					unset($dm);					
    					
    					// Insert the chat member
    					$this->registry->db->query_write("
    						INSERT INTO " . TABLE_PREFIX . "dbtech_vbshout_chatroommember
    							(chatroomid, userid, status)
    						VALUES (
    							" . $this->registry->db->sql_prepare($chatroomid) . ",
    							" . $this->registry->db->sql_prepare($this->registry->userinfo['userid']) . ",
    							1
    						)
    					");
    					
    					// Set chat room info
    					VBSHOUT::$fetched['chatroom'] = array(
    						'chatroomid' 	=> $chatroomid,
    						'title' 		=> $title
    					);
    
    					return false;
    					break;
    
    				default:
    					$return_value = true;
    					$handled = false;
    					
    					
    
    					($hook = vBulletinHook::fetch_hook('dbtech_vbshout_command_2')) ? eval($hook) : false;
    					
    					if (!$handled)
    					{
    						//$this->error('dbtech_vbshout_invalid_command');
    						//return false;
    					}
    					return $return_value;
    					break;
    			}
    		}
    		
    		return true;
    	}
    
    	/**
    	* Verifies the number of images in the post text. Call it from pre_save() after pagetext/allowsmilie has been set
    	*
    	* @return	bool	Whether the post passes the image count check
    	*/
    	function verify_image_count($pagetext = 'pagetext', $allowsmilie = 'allowsmilie', $parsetype = 'nonforum', $table = null)
    	{
    		global $vbulletin;
    
    		$_allowsmilie =& $this->fetch_field($allowsmilie, $table);
    		$_pagetext =& $this->fetch_field($pagetext, $table);
    
    		if ($_allowsmilie !== null AND $_pagetext !== null)
    		{
    			// check max images
    			require_once(DIR . '/includes/functions_misc.php');
    			require_once(DIR . '/includes/class_bbcode_alt.php');
    			$bbcode_parser = new vB_BbCodeParser_ImgCheck($this->registry, fetch_tag_list());
    			$bbcode_parser->set_parse_userinfo($vbulletin->userinfo);
    
    			if ($this->registry->options['maximages'] AND !$this->info['automated'])
    			{
    				$imagecount = fetch_character_count($bbcode_parser->parse($_pagetext, $parsetype, $_allowsmilie, true), '<img');
    				if ($imagecount > $this->registry->options['maximages'])
    				{
    					$this->error('toomanyimages', $imagecount, $this->registry->options['maximages']);
    					return false;
    				}
    			}
    		}
    
    		return true;
    	}
    
    	/**
    	* Any checks to run immediately before saving. If returning false, the save will not take place.
    	*
    	* @param	boolean	Do the query?
    	*
    	* @return	boolean	True on success; false if an error occurred
    	*/
    	function pre_save($doquery = true)
    	{
    		if ($this->presave_called !== null)
    		{
    			return $this->presave_called;
    		}
    		
    		$instanceid = $this->fetch_field('instanceid');
    		$this->info['instance'] = (!$this->info['instance'] ? VBSHOUT::$cache['instance']["$instanceid"] : $this->info['instance']);
    		
    		if (!$this->condition)
    		{
    			if ($this->fetch_field('dateline') === null)
    			{
    				$this->set('dateline', TIMENOW);
    			}
    			
    			if ($this->fetch_field('type') === null)
    			{
    				$this->set('type', VBSHOUT::$shouttypes['shout']);
    			}
    			
    			if ($this->fetch_field('userid') === null)
    			{
    				$this->set('userid', $this->registry->userinfo['userid']);
    			}
    		}
    		
    		if (count($this->info['instance']))
    		{
    			// Grab userinfo
    			$userinfo = ($this->fetch_field('userid') == $this->registry->userinfo['userid'] ? $this->registry->userinfo : fetch_userinfo($this->fetch_field('userid')));			
    			
    			// Initialise BBCode Permissions
    			$permarray = array(
    				'permissions_parsed' 		=> VBSHOUT::loadInstancePermissions($this->info['instance'], $userinfo),
    				'bbcodepermissions_parsed' 	=> VBSHOUT::loadInstanceBbcodePermissions($this->info['instance'], $userinfo)
    			);
    			
    			// Shorthand
    			$message = $this->fetch_field('message');
    			
    			if (!$this->info['automated'])
    			{
    				// Do character count checking
    				if ($this->info['instance']['options']['maxchars'] != 0 AND ($postlength = vbstrlen($message)) > $this->info['instance']['options']['maxchars'] AND !VBSHOUT::$permissions['ismanager'])
    				{
    					$this->error('dbtech_vbshout_charlimit', $postlength, $this->info['instance']['options']['maxchars']);
    					return false;
    				}
    		
    				if ($this->info['instance']['options']['maximages'])
    				{
    					// Set whether we're allowed to use smilies
    					$this->set('allowsmilie', $this->info['instance']['options']['allowsmilies']);
    					
    					if ($this->registry->options['maximages'] OR $this->info['instance']['options']['maximages'])
    					{
    						if ($this->info['instance']['options']['maximages'])
    						{
    							// Hack this
    							$maximages = $this->registry->options['maximages'];
    							$this->registry->options['maximages'] = $this->info['instance']['options']['maximages'];
    						}
    						
    						if (!$this->verify_image_count('message', 'allowsmilie', 'nonforum'))
    						{
    							return false;
    						}
    						
    						if ($this->info['instance']['options']['maximages'])
    						{
    							// Restore hack
    							$this->registry->options['maximages'] = $maximages;
    						}
    					}
    				}
    				
    				if ($this->info['instance']['options']['maxsize'])
    				{
    					// Replace the SIZE BBCode if needed
    					$message = preg_replace_callback(
    						'#\[size=(\d+)\]#i', 
    						array('VBSHOUT', 'process_bbcode_size'), 
    						$message
    					);
    					$message = preg_replace_callback(
    						'#\[size=\"(\d+)\"\]#i', 
    						array('VBSHOUT', 'process_bbcode_size'), 
    						$message
    					);
    					$message = preg_replace_callback(
    						'#\[size=\'(\d+)\'\]#i', 
    						array('VBSHOUT', 'process_bbcode_size'), 
    						$message
    					);
    					
    					// Set raw message
    					$this->set('message', $message);
    				}
    			}
    			
    			if ($this->condition)
    			{
    				// Update
    				if ($this->existing['userid'] == $this->registry->userinfo['userid'] AND (!$this->info['instance']['permissions_parsed']['caneditown'] AND $this->fetch_field('instanceid') > 0))
    				{
    					// We can't edit our own shouts
    					$this->error('dbtech_vbshout_may_not_edit_own');
    					return false;
    				}
    				
    				if ($this->existing['userid'] != $this->registry->userinfo['userid'] AND (!$this->info['instance']['permissions_parsed']['caneditothers'] AND $this->fetch_field('instanceid') > 0))
    				{
    					// We can't edit our own shouts
    					$this->error('dbtech_vbshout_may_not_edit_others');
    					return false;
    				}
    			}
    			else
    			{
    				if (!$this->info['instance']['permissions_parsed']['canshout'] AND $this->fetch_field('instanceid') != 0 AND !$this->info['automated'])
    				{
    					// We aren't allowed to post shouts
    					$this->error('dbtech_vbshout_may_not_shout');
    					return false;
    				}
    			}			
    		}
    		
    		// Set raw message
    		$this->set('message_raw', $message);
    				
    		// Parse message for /pm command and other on-the-fly messages that's not supposed to return true
    		if (!$this->parse_action_codes())
    		{
    			// We had sum error
    			return false;
    		}
    		
    		// Re-grab this (custom command support pretty much)
    		$message = $this->fetch_field('message');
    		
    		// This is no longer needed
    		$this->do_unset('allowsmilie');
    		
    		// Ensure we got BBCode Parser
    		require_once(DIR . '/includes/class_bbcode.php');
    		if (!function_exists('convert_url_to_bbcode'))
    		{
    			require_once(DIR . '/includes/functions_newpost.php');
    		}
    		if (!function_exists('vbshout_fetch_tag_list'))
    		{
    			require_once(DIR . '/dbtech/vbshout/includes/functions.php');
    		}		
    		
    		if (count($this->info['instance']) AND !$this->info['automated'])
    		{
    			// Shorthand
    			$instance = $this->info['instance'];
    			
    			// Store these settings
    			$backup = array(
    				'allowedbbcodes' 	=> $this->registry->options['allowedbbcodes'],
    				'allowhtml' 		=> $this->registry->options['allowhtml'],
    				'allowbbcode' 		=> $this->registry->options['allowbbcode'],
    				'allowsmilies' 		=> $this->registry->options['allowsmilies'],
    				'allowbbimagecode' 	=> $this->registry->options['allowbbimagecode']
    			);	
    			
    			// Initialise the parser (use proper BBCode)
    			$parser = new vB_BbCodeParser($this->registry, vbshout_fetch_tag_list((array)VBSHOUT::$tag_list, $permarray));
    			
    			// Override allowed bbcodes
    			$this->registry->options['allowedbbcodes'] = $permarray['bbcodepermissions_parsed']['bit'];
    			
    			// Override the BBCode list
    			$this->registry->options['allowhtml'] 			= false;
    			$this->registry->options['allowbbcode'] 		= true;
    			$this->registry->options['allowsmilies'] 		= $instance['options']['allowsmilies'];
    			$this->registry->options['allowbbimagecode'] 	= ($permarray['bbcodepermissions_parsed']['bit'] & 1024);
    			
    			if ($permarray['bbcodepermissions_parsed']['bit'] & 64)
    			{
    				// We can use the URL BBCode, so convert links
    				$message = convert_url_to_bbcode($message);
    			}
    
    			if ($instance['options']['anonymise'])
    			{
    				// Convert to anon
    				$message = $this->anonymiseLinks($message);
    			}
    
    			// BBCode parsing
    			$message = $parser->parse($message, 'nonforum');	
    		}
    		else
    		{
    			// Initialise the parser (use proper BBCode)
    			$parser = new vB_BbCodeParser($this->registry, fetch_tag_list());
    			
    			if ($this->registry->options['allowedbbcodes'] & 64)
    			{
    				// We can use the URL BBCode, so convert links
    				$message = convert_url_to_bbcode($message);
    			}
    
    			if ($instance['options']['anonymise'])
    			{
    				// Convert to anon
    				$message = $this->anonymiseLinks($message);
    			}
    
    			// BBCode parsing
    			$message = $parser->parse($message, 'nonforum');		
    		}
    		
    		// Set raw message
    		$this->set('message', htmlspecialchars_uni($message));		
    		
    		$return_value = true;
    		//($hook = vBulletinHook::fetch_hook('dbtech_vbshout_shout_preinsert')) ? eval($hook) : false;
    		
    		// Ensure that shit doesn't return true if there's errors
    		$return_value = (!empty($this->errors) ? false : $return_value);
    		
    		$this->presave_called = $return_value;
    		return $return_value;
    	}
    
    	/**
    	* Sets the supplied data to be part of the data to be saved. Use setr() if a reference to $value is to be passed
    	*
    	* @param	string	The name of the field to which the supplied data should be applied
    	* @param	mixed	The data itself
    	* @param	boolean	Clean data, or insert it RAW (used for non-arbitrary updates, like posts = posts + 1)
    	* @param	boolean	Whether to verify the data with the appropriate function. Still cleans data if previous arg is true.
    	* @param	string	Table name to force. Leave as null to use the default table
    	*
    	* @return	boolean	Returns false if the data is rejected for whatever reason
    	*/
    	function set($fieldname, $value, $clean = true, $doverify = true, $table = null)
    	{
    		parent::set($fieldname, $value, $clean, $doverify, $table);
    		
    		return $this;
    	}
    	
    	/**
    	 * Overridding parent function to add hook support
    	 *
    	* @param	boolean	Do the query?
    	* @param	mixed	Whether to run the query now; see db_update() for more info
    	* @param 	bool 	Whether to return the number of affected rows.
    	* @param 	bool	Perform REPLACE INTO instead of INSERT
    	* @param 	bool	Perfrom INSERT IGNORE instead of INSERT
    	*
    	* @return	mixed	If this was an INSERT query, the INSERT ID is returned
    	*/
    	function save($doquery = true, $delayed = false, $affected_rows = false, $replace = false, $ignore = false)
    	{
    		if (!$this->pre_save($doquery))
    		{
    			// Pre-save failed
    			if (!empty($this->errors))
    			{
    				// Set the errors
    				VBSHOUT::$fetched['error'] = implode('<br />', $this->errors);
    				
    				return false;
    			}
    			
    			return false;
    		}
    		
    		// Call and get the new id
    		$result = parent::save($doquery, $delayed, $affected_rows, $replace, $ignore);
    		
    		($hook = vBulletinHook::fetch_hook('dbtech_vbshout_shout_insert')) ? eval($hook) : false;				
    
    		return $result;
    	}
    	
    	/**
    	* Additional data to update after a save call (such as denormalized values in other tables).
    	* In batch updates, is executed once after all records are updated.
    	*
    	* @param	boolean	Do the query?
    	*/
    	function post_save_once($doquery = true, $return = null)
    	{
    		
    		
    		$return_value = true;
    		($hook = vBulletinHook::fetch_hook('dbtech_vbshout_shout_post_save_once')) ? eval($hook) : false;
    
    		return $return_value;
    	}	
    
    	/**
    	* Additional data to update after a save call (such as denormalized values in other tables).
    	* In batch updates, is executed for each record updated.
    	*
    	* @param	boolean	Do the query?
    	*/
    	function post_save_each($doquery = true, $return = null)
    	{
    		global $vbphrase;
    		
    		
    
    		($hook = vBulletinHook::fetch_hook('dbtech_vbshout_shout_post_save_each')) ? eval($hook) : false;				
    		
    		if ($this->condition)
    		{
    			// Log this command
    			VBSHOUT::log_command('shoutedit', serialize(array('old' => $this->existing['message'], 'new' => $this->fetch_field('message'))));			
    			
    			// And a winrar is us
    			//$this->fetched['success'] = $vbphrase['dbtech_vbshout_edited_shout_successfully'];			
    		}
    		else
    		{
    			if ($this->fetch_field('id') > 0)
    			{
    				// We sent this to someone
    				$this->registry->db->query_write("
    					UPDATE " . TABLE_PREFIX . "user
    					SET dbtech_vbshout_pm = " . TIMENOW . "
    					WHERE userid = " . intval($this->fetch_field('id'))
    				);
    			}
    			
    			if ($this->fetch_field('userid') > 0)
    			{
    				// increment shouts count
    				$this->registry->db->query_write("
    					UPDATE " . TABLE_PREFIX . "user
    					SET 
    						dbtech_vbshout_shouts = dbtech_vbshout_shouts + 1,
    						dbtech_vbshout_shouts_lifetime = dbtech_vbshout_shouts_lifetime + 1
    					WHERE userid = " . intval($this->fetch_field('userid'))
    				);
    				
    				if (VBSHOUT::$isPro)
    				{
    					$currshouts = $this->registry->db->query_first_slave("
    						SELECT dbtech_vbshout_shouts_lifetime AS shouts
    						FROM " . TABLE_PREFIX . "user 
    						WHERE userid = " . intval($this->fetch_field('userid'))
    					);
    					foreach ((array)VBSHOUT::$cache['instance'] as $instanceid => $instance)
    					{
    						if (!$instance['options']['shoutping_interval'])
    						{
    							// Not having notices here
    							continue;
    						}
    				
    						if ($currshouts['shouts'] % $instance['options']['shoutping_interval'] != 0)
    						{
    							// We only want matching intervals
    							continue;
    						}
    						
    						$shout = VBSHOUT::initDataManager('Shout', $this->registry, ERRTYPE_ARRAY);
    							$shout->set_info('automated', true);
    							$shout->set('message', construct_phrase(
    								$vbphrase["dbtech_vbshout_has_reached_x_shouts"],
    								$currshouts['shouts']
    							))
    							->set('instanceid', $instanceid)				
    							->set('type', VBSHOUT::$shouttypes['notif'])
    							->set('userid', $this->fetch_field('userid'));
    						$shout->save();
    						unset($shout);
    					}	
    				}
    			}
    		}
    		
    		if ($this->fetch_field('chatroomid'))
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('chatroom_' . $this->fetch_field('chatroomid') . '_', VBSHOUT::$cache['chatroom'][$this->fetch_field('chatroomid')]['instanceid']);
    		}
    		else if ($this->fetch_field('id'))
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('pm_' . $this->fetch_field('id') . '_', $this->fetch_field('instanceid'));
    			VBSHOUT::set_aop('shouts', $this->fetch_field('instanceid'));			
    		}
    		else
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('shouts', $this->fetch_field('instanceid'));
    		}
    		
    		if ($this->fetch_field('type') == VBSHOUT::$shouttypes['notif'])
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('shoutnotifs', $this->fetch_field('instanceid'), false, true);
    		}
    		
    		if ($this->fetch_field('type') == VBSHOUT::$shouttypes['system'])
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('systemmsgs', $this->fetch_field('instanceid'), false, true);
    		}
    	}
    	
    	/**
    	* Additional data to update before a delete call (such as denormalized values in other tables).
    	*
    	* @param	boolean	Do the query?
    	*/
    	function pre_delete($doquery = true)
    	{
    		$instanceid = $this->fetch_field('instanceid');
    		$this->info['instance'] = (!$this->info['instance'] ? VBSHOUT::$cache['instance']["$instanceid"] : $this->info['instance']);
    		
    		if ($this->existing['userid'] == $this->registry->userinfo['userid'] AND (!$this->info['instance']['permissions_parsed']['caneditown'] AND $this->fetch_field('instanceid') > 0))
    		{
    			// We can't edit our own shouts
    			$this->error('dbtech_vbshout_may_not_edit_own');
    			return false;
    		}
    		
    		if ($this->existing['userid'] != $this->registry->userinfo['userid'] AND (!$this->info['instance']['permissions_parsed']['caneditothers'] AND $this->fetch_field('instanceid') > 0))
    		{
    			// We don't have permission to edit others' shouts
    			$this->error('dbtech_vbshout_may_not_edit_others');
    			return false;
    		}
    		
    		return true;
    	}
    	
    
    	/**
    	* Deletes the specified data item from the database
    	*
    	* @return	integer	The number of rows deleted
    	*/
    	function delete($doquery = true)
    	{
    		if (!$this->pre_delete($doquery))
    		{
    			// Pre-save failed
    			if (!empty($this->errors))
    			{
    				// Set the errors
    				VBSHOUT::$fetched['error'] = implode('<br />', $this->errors);
    				
    				return false;
    			}
    			
    			return false;
    		}
    		
    		parent::delete($doquery);
    		
    		return true;
    	}	
    	
    	/**
    	* Additional data to update after a delete call (such as denormalized values in other tables).
    	*
    	* @param	boolean	Do the query?
    	*/
    	function post_delete($doquery = true)
    	{
    		// Decrement shout counters
    		$this->registry->db->query_write("
    			UPDATE " . TABLE_PREFIX . "user
    			SET dbtech_vbshout_shouts = dbtech_vbshout_shouts - 1
    			WHERE userid = " . $this->existing['userid']
    		);
    		
    		// Log this command
    		VBSHOUT::log_command('shoutdelete', $this->existing['message']);
    		
    		// Update the AOP
    		VBSHOUT::set_aop('shouts', $this->existing['instanceid'], false, true);
    		
    		if ($this->fetch_field('type') == VBSHOUT::$shouttypes['notif'])
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('shoutnotifs', $this->existing['instanceid'], false, true);
    		}
    		else if ($this->fetch_field('type') == VBSHOUT::$shouttypes['system'])
    		{
    			// Update the AOP
    			VBSHOUT::set_aop('systemmsgs', $this->existing['instanceid'], false, true);
    		}
    		
    		$return_value = true;
    		//($hook = vBulletinHook::fetch_hook($this->hook_delete)) ? eval($hook) : false;
    
    		return $return_value;
    	}	
    }
    
    ?>
    İlginize teşekkür ederim.