인코딩이 외부적으로 euc-kr / 내부적으로는 utf-8인
방문자목록없는 간단한 채팅소스를 수정한 것입니다.

새글이 올라오면 어떻게 표시해달라는 요청이 있어서,
document.title에 새글이 올라왔다는 문구를 적었습니다.
새글확인이 1초마다 이뤄지니까, 타이틀에 새글이 올라왔다는 문구는 1초동안 유지됩니다.
1초뒤에 새글이 없으면, 다시 채팅방으로 돌아가고..

간단한 수정인데, 꽤 유용하네요.
채팅소스에도 적용하면 좋을거 같습니다.

하여튼 좋은 기능을 제안해주셔서 감사합니다.
잘쓰세요...

아래는 소스. 위에는 업로드한 파일압축입니다.

그리고
FF에서 Enter로 글이 안올라가길래,
form을 달아서 Enter로 글이 올라가도록 했습니다.


<?
session_start();
$chat = "chat.php";
if($_POST[xname] || $_SERVER[QUERY_STRING]){
header ("Content-Type: text/html; charset=UTF-8");
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
if($_POST[xname] && $_POST[text]) {
if(!$_SESSION[name] || $_SESSION[name] != $_POST[xname]) {
$_POST[xname] = str_replace('<', '&lt;', str_replace(' ', '', stripslashes(trim($_POST[xname]))));
$_POST[xname] = preg_replace("` [\s]`i", "", $_POST[xname]);
$_POST[xname] = preg_replace("`[\x1b\x18\x7f\t]`", "", $_POST[xname]);
if($_SESSION[name]) $nickc = "--\x1b<font class=mc><font class=mm>".$_SESSION[name]."</font> ==> <font class=mm>".$_POST[xname]."</font></font>\n";
session_unregister("name");
$name = $_POST[xname];
session_register("name");
}
if($_POST[xname]) {
$_POST[text] = preg_replace("`[\x1b\x18\x7f<]`", "", stripslashes($_POST[text]));
$nickc .= $_POST[xname]."\x1b".$_POST[text]."\n";
$fp = fopen("./_text", "a");
fputs($fp, $nickc);
fclose($fp);
if(filesize("./_text") > 2048) {
$fp = fopen("./_text", "r");
fread($fp, 1536);
fgets($fp);
while(!feof($fp)) $fpo .= fgets($fp);
fclose($fp);
$fp = fopen("./_text", "w");
fputs($fp, $fpo);
fclose($fp);
}
}
exit;
}
if($_GET[tex]) {
if(file_exists("./_text")){
if($_GET[tex] == -1) $_GET[tex] = 0;
$fze = filesize("./_text");
if($fze != $_GET[tex]) {
echo $fze."\x7f";
$fp = fopen("./_text", "r");
while(!feof($fp)) {
if($_GET[tex] && $fze > $_GET[tex]) fread($fp, $_GET[tex]);
if($fpo = trim(fgets($fp))) echo $fpo."\x7f";
}
fclose($fp);
}
}
exit;
}
if($_GET[delete] == "text" && $_SESSION[admin_pass]) {
$fp = fopen("./_text", "w");
fclose($fp);
}
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>채팅방</title>
</head>
<body>
<script>
function go() {
var url = '<?=$chat?>?tex=' + document.getElementsByName('ntim')[0].value;
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
var str = xmlHttp.responseText;
if(str) {
var vew = str.split("\x7f");
allc = vew.length -1;
if(allc > 1) {
document.getElementsByName('ntim')[0].value = vew[0];
if(document.getElementById('AA').innerHTML == '') str = "<table border=0 cellspacing=0 cellpadding=0 width=100% style='margin-bottom:20;table-layout:fixed'>";
else str = "";
for(i = 1;i < allc;i++){
var nam = vew[i].split("\x1b");
str += "<tr class=trh><td class=name>"+ nam[0] +"</td><td width=10>:</td><td class=memo>"+ nam[1] +"</td></tr>";
str += "<tr><td colspan=3 bgcolor=#E6E6E6 height=1><img height=1></td></tr>";
}
str += "</table>";
document.getElementById('AA').innerHTML = document.getElementById('AA').innerHTML.substring(0,document.getElementById('AA').innerHTML.length-8) + str;
document.getElementById('AA').scrollTop = 10000000;
document.title='새글이 올라왔습니다';
}
} else document.title = '채팅방';
setTimeout('go()', 1000);
delete xmlHttp;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}

function wte(){
if(window.ActiveXObject) {
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest) {
var xmlHttp = new XMLHttpRequest();
}
var param = '<?=$chat?>?&xname='+ document.getElementsByName("xname")[0].value.replace(/[&'"]/gi,"") +'&text='+ document.getElementsByName("text")[0].value.replace("&","%26");
xmlHttp.open("POST", param, true);
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Content-length", param.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200) {
document.getElementsByName('text')[0].value = '';
document.getElementsByName('text')[0].focus();
delete xmlHttp;
}
}
xmlHttp.send(param);
}
window.onload = function(){setTimeout("document.getElementsByName('ntim')[0].value='-1';", 50);}
setTimeout('go()', 100);
</script>
<center>
<table border=0 cellspacing=0 cellpadding=5 width=330 style='border:1px solid black'>
<tr height=200><td colspan=3><div id=AA style='width:320;height:200'></div></td></tr>
<tr height=30><td colspan=3><form onsubmit="wte();return false;" style="margin:0"><input type=text name='xname' maxlength=10 style='width:65' value='<?=iconv('UTF-8', 'CP949//IGNORE', $_SESSION[name])?>'>
<input type='text' name='text' style='width:200;'>
<input type='submit' value='쓰기' onclick="wte();return false;" class='button'>
<input type='hidden' name='ntim' value='-1'></form>
</td></tr>
</table>
</center>
<style>
body {font-size:9pt;font-family:gulim;word-break:break-all;}
td {word-break:break-all;font-size:9pt;}
.mm {color:#D7D7D7;font-weight:bold;font-family:gulim;text-align:center;padding-top:5}
.mc {color:#D7D7D7;font-family:gulim;text-align:center;padding-top:5}
.button {background-color:#D7D7D7;border:0;border:1px solid black;margin-right:4px;margin-left:4px;width:35px}
.name {width:50;padding-left:5;font-weight:bold;}
.memo {padding:5px 0px 5px 5px;width:210;}
.trh {padding:6px 0px 6px 0px;}
#AA {overflow-x: hidden; overflow-y: auto;background-color:#FFFFFF;border:1px solid black; }
</style>
</body>
</html>
by Anna 안나 2008. 6. 8. 10:54