2010年3月29日月曜日

IRCボット改良版


; Character Codepage Encode module

#ifndef __ENCODE_AS__
#define global __ENCODE_AS__

#module "mod_encode"

#const global CODEPAGE_S_JIS 932 ; Shift-JIS
#const global CODEPAGE_EUC_JP 51932 ; EUC-JP
#const global CODEPAGE_JIS 50220 ; iso-2022-jp(JIS)
#const global CODEPAGE_UTF_7 65000 ; utf-7
#const global CODEPAGE_UTF_8 65001 ; utf-8
#const global CODEPAGE_UNICODE 1200 ; Unicode
#const global CODEPAGE_UNICODE_BE 1201 ; Unicode(Big-Endian)
#const global CODEPAGE_AUTODET_ALL 50001 ; auto detect all
#const global CODEPAGE_AUTODET 50932 ; auto detect

#usecom IMultiLanguage@mod_encode "{275c23e1-3747-11d0-9fea-00aa003f8646}" \
"{275c23e2-3747-11d0-9fea-00aa003f8646}"
#comfunc MuLang_ConvertString 9 var, int, int, var, var, var, var

#deffunc _encode_init
newcom ml, IMultiLanguage
return

#deffunc _encode_term onexit
delcom ml
return

#deffunc __FromSJIS@mod_encode str _src, int srcCodepage, var dest, int destCodepage, local src, local srcSize, local destSize, local pdwMode
pdwMode = 0
srcSize = -1
destSize= 0
src = _src
sdim dest
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
sdim dest, destSize + 1
MuLang_ConvertString ml, pdwMode, srcCodepage, destCodepage, src, srcSize, dest, destSize
return destSize

#defcfunc _ToSJIS@mod_encode var src, int srcCodepage, int destCodepage, local dest
__FromSJIS src, srcCodepage, dest, destCodepage
return dest

#define _FromSJIS __FromSJIS@mod_encode

#global


_encode_init


; SJIS -> other char code
#define sjis2eucjp(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_EUC_JP
#define sjis2jis(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_JIS
#define sjis2utf7n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_7
#define sjis2utf8n(%1, %2) _FromSJIS@mod_encode %2, CODEPAGE_S_JIS, %1, CODEPAGE_UTF_8

; other char code -> SJIS
#define ctype eucjp2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_EUC_JP, CODEPAGE_S_JIS)
#define ctype jis2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_JIS, CODEPAGE_S_JIS)
#define ctype utf7n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_7, CODEPAGE_S_JIS)
#define ctype utf8n2sjis(%1) _ToSJIS@mod_encode(%1, CODEPAGE_UTF_8, CODEPAGE_S_JIS)

////////////////////////////////match
#uselib"kernel32.dll"

#cfunc global IsDBCSLeadByteEx "IsDBCSLeadByteEx" int,int
#define global ctype MB1(%1) IsDBCSLeadByteEx(0,%1)
#module
#defcfunc match str buf1_,str buf2_
buf1=buf1_
buf2=buf2_
buf3=""
hyoka=0
index=0
count=0
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
while(1)
while(1)
data=peek(buf1,index)
if(MB1(data)){
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
data_(count)=peek(buf1,index)
index+
count+
}else{
pre_index=index
data_(count)=peek(buf1,index)
index+
count+
}
if(count>=3||data=0){
buf3=strf("%c",data_(0))+strf("%c",data_(1))+strf("%c",data_(2))+strf("%c",data_(3))
data_(3)=0
data_(2)=0
data_(1)=0
data_(0)=0
count=0
_break
}
wend
index=pre_index
// mes buf3
if(instr(buf2,0,buf3)>=0){

hyoka+


}
if peek(buf1,index)=0:_break

wend
return hyoka
#global
//////////////////////////match



#include "hspsock.as"

onexit *exit
goto *hi
*exit
sockclose SockId
end
*hi

/////定数/////////////////////////////

ServerName="irc.freenode.net"
Port=6667
NickName=""
ChannelName="#hspDwiki_TEST"
CloseMessage="Leaving..."
MainWindowSize=400+6+21

/////変数初期化///////////////////////

Command=""
InputData=""
Message=""
SockId=0
sdim StringsData,65536
sdim GetData,1024
sdim send_data,1024
sdim aidata_,1024*1024*16
sdim aidata,1024*1024*16
sdim aidata_load,1024*1024*16
sdim nowgetdata,1024
sdim gyodata,1024
savefile="aigakushu.txt"
loadfile="aigakushu_load.txt"


/////ウィンドウ・オブジェクト配置/////

screen 3,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17

pos 12,12
mes "チャンネル名"

pos ,12+21
objsize 300-24,19
input ChannelName

pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*join


screen 4,300,12+21+19+6+21+12,2
syscolor 15
boxf
color
sysfont 17

pos 12,12
mes "切断メッセージ"

pos ,12+21
objsize 300-24,19
input CloseMessage

pos 300-12-88,12+21+19+6
objsize 88,21
button gosub "OK",*part

screen 5,300,12+21+19+6+21+19+6+21+21+6+21+12+21+6,2
syscolor 15
boxf
color
sysfont 17

pos 12,12
mes "接続サーバ"

pos ,12+21
objsize 300-24,19
input ServerName

pos ,12+21+19+6
mes "ポート"

pos ,12+21+19+6+21
objsize 300-24,19
input Port

pos ,12+21+19+6+21+19+6
mes "ユーザー名"

pos ,12+21+19+6+21+19+6+21
objsize 300-24,19
input NickName

pos 300-12-88,12+21+19+6+21+19+6+21+21+6
objsize 88,21
button "OK",*session


screen 0,640,MainWindowSize+6+21+6+21
syscolor 15
boxf
color
sysfont 17

pos 12,12
objsize 88,21
button gosub "LOGIN",*session_req

pos 12+88+6,12
objsize 88,21
button gosub "JOIN",*join_req

pos 12+88+6+88+6,12
objsize 88,21
button gosub "PART",*part_req

pos 12,12+21+6
objsize 640-24,MainWindowSize-12-21-6-6-21-12
mesbox StringsData,,,4
Hmesbox=stat

pos 12,MainWindowSize-12-21
objsize 640-88-24-6,21
input InputData
Hinput=stat

pos 640-88-12,MainWindowSize-12-21
objsize 88,21
button gosub "OK",*talk

pos 640-88-12,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "学習OFF",*gaku
gakuid=stat

pos 640-88-12-6-88,MainWindowSize-12-21+6+21
objsize 88,21
button gosub "発言OFF",*hatu
hatuid=stat

pos 12,MainWindowSize-12-21+6+21+3
color
mes "読書込ファイル"

pos 12+6+88,MainWindowSize-12-21+6+21
objsize 88,21
input savefile

pos 12+88+6+88+6,MainWindowSize-12-21+6+21+3
color
mes "読込ファイル"

pos 12+88+6+88+6+6+88,MainWindowSize-12-21+6+21
objsize 88,21
input loadfile

pos 640-88-12-6-88,MainWindowSize-12-21+6+21+6+21
objsize 88,21
button gosub "UTF-8",*moji
mojiid=stat

stop

*moji
mojic xor 1
if mojic :objprm mojiid,"JIS":else:objprm mojiid,"UTF-8"
return

*gaku
ai xor 1
if ai:objprm gakuid,"学習ON":else:objprm gakuid,"学習OFF"
return
*hatu
ht xor 1
if ht:objprm hatuid,"発言ON":else:objprm hatuid,"発言OFF"
return
/////データチェック///////////////////

*main
repeat
sockcheck SockID
stat_=stat
if stat_=0{
gsel 0
sockget GetData,1024,SockID

if(mojic==0){
get_data=utf8n2sjis(GetData)
}else{
get_data=jis2sjis(GetData)
}

StringsData+=get_data+"\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
if(instr(get_data,0,"PRIVMSG")>=0){
if(ai){
notesel aidata_load
noteload loadfile
if(1){
nowgetdata=strmid(get_data,instr(get_data,instr(get_data,0,"PRIVMSG"),":")+instr(get_data,0,"PRIVMSG")+1,strlen(get_data)-instr(get_data,instr(get_data,0,"PRIVMSG"),":")-instr(get_data,0,"PRIVMSG")-1)
if(ht){
aidata_=aidata_load+aidata
notesel aidata_
count=0
maxmatch=0
countmax=notemax*5/6-1
while(1)
if(count>=countmax):_break
noteget gyodata,count
// dialog "1: "+gyodata
// dialog "2: "+nowgetdata
// dialog "3: "+match(gyodata,nowgetdata)
if match(gyodata,nowgetdata)>=maxmatch{
maxmatch=match(gyodata,nowgetdata)

maxmatchgyo=count
}
count+
wend
// dialog "4: "+maxmatch
if (1.0*maxmatch/strlen(nowgetdata)>=0.13||(strlen(nowgetdata)>=8&&maxmatch>=4)) && strlen(nowgetdata)>=4:noteget gyodata,maxmatchgyo+1:{
if(rnd(100)>82){
gosub *aitalk
}
}
}
aidata+=nowgetdata
notesel aidata
notesave savefile
}
}
}
if(instr(get_data,0,"PING")=0)||(instr(get_data,0,"ping")=0){
gosub *pong
}
}

wait 1
loop

/////コマンド送信////////////////////

*enter
send_buf=""+Message+""+Command+"\n"



if(mojic==0){
sjis2utf8n send_data,send_buf
}else{
sjis2jis send_data,send_buf
}

sockput send_data,SockId
StringsData+=""+Message+""+Command+"\n\n"
objprm Hmesbox,StringsData
sendmsg objinfo(Hmesbox,2),0xb6,0,65536
Message=""
return

*talk
Message="PRIVMSG "+ChannelName+" :"
Command=InputData
gosub *enter
objprm Hinput,""
return

*aitalk
Message="PRIVMSG "+ChannelName+" :"
Command=gyodata
gosub *enter
return
*pong
Message="PONG"
Command=""
gosub *enter
return

*join_req
gsel 3,1
return

*join
gsel 3,-1
gsel 0
Message="JOIN "+ChannelName
Command=""
gosub *enter
objprm Hinput,""
return

*part_req
gsel 4,1
return

*part
gsel 4,-1
gsel 0
Message="PART "+ChannelName+" :"
Command=CloseMessage
gosub *enter
objprm Hinput,""
return

*session_req
gsel 5,1
return

*session
gsel 5,-1
gsel 0
if once:sockclose SockId
sockopen SockId,ServerName,Port
sockput "USER username host server real\n",SockId
sockput "NICK "+NickName+"\n",SockId
once=1

notesel aidata
exist savefile
if strsize=-1{
notesave savefile
}
noteload savefile

notesel aidata_load
exist loadfile
if strsize=-1{
notesave loadfile
}
noteload loadfile

goto *main

2 件のコメント:

kazamidori さんのコメント...

連絡先が見あたらないのでこちらに失礼します。
HSPでIRCbotを作成するにあたり、begriffさんの"IRCボット改良版"のソースを参考、引用させていただきました。

このプログラムを近いうちに配布しようと思うのですが、よろしいでしょうか?

Readmeにはその主を記載する予定です。

begriff-takazin さんのコメント...

えぇ構いませんよ、公開するときは教えてくださると嬉しいです。