HSPに投稿されたコード一覧

HSP Tweetのハッシュタグ認識

#ifndef __HasyuTag__
#define __HasyuTag__
#include "kernel32.as"
#module

//--------------------------------------------------------------------------------------------------
/*

%index 
Tag
ツイートの解析

%prm
p1,p2,p3
p1 = 文字列 ; 解析結果が入ります
p2 = 文字列 : 解析するツイート
p3 = 文字列 : 解析したハッシュタグが代入されます

%
%*/
//--------------------------------------------------------------------------------------------------
#deffunc Tag var p1, str p2, var p3
miku = p2

value = instr(miku, , "#") + 1
getstr buf, miku, value, , instr(miku, value, "」")

MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0

if stat<3 {

	getstr buf, miku, value, , instr(miku, value, "-")
	MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
	if stat<3 {

		getstr buf, miku, value, , instr(miku, value, "【")
		MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
		if stat<3 {

			getstr buf, miku, value, , instr(miku, value, "?")
			MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
			if stat<3 {

				getstr buf, miku, value, , instr(miku, value, "!")
				MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
				if stat<3 {

					getstr miku, alt, value, , instr(miku, value, " ")
					MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0
					if stat<3 {
					}
				}
			}
		}
	}

;この時点で[buf]にはハッシュタグのみが入っています
p3 = buf

split miku,"#",tweet1,tweet2,tweet3

kome="!#"+buf+"!";ハッシュタグの処理

bad=tweet1+kome

;ハッシュの処理
split miku,"#",mes1,mes2
;mes2に基本的に#以降が入る
split mes2," ",me1,me2
a=0;←こいつで判断

;分割 ハッシュタグ以降を切り取る
if strlen(me2)=0 {
	split mes2,"」",m1,m2
	a++
	if strlen(m2)=0 {
		split mes2,"-",ai,sou
		a++
		if strlen(sou)=0 {
			split mes2,"「",itibann,takara
			a++
			if strlen(takara)=0 {
				split mes2,"☆",yui,yuri
				a++
				if strlen(yuri)=0 {
					split mes2,"★",hinata,otonasi
					a++
					if strlen(otonasi)=0 {
						split mes2,"?",a1,a2
						a++
						if strlen(a2)=0 {
							split mes2,"【",a3,a4
							a++
							if strlen(a4)=0 {
								split mes2,"!",a5,a6
								a++
							}
						}
					}
				}
			}
		}
	}
}
if a=1 : op="」" : mes2=m2
if a=0 : op=" "  : mes2=me2
if a=2 : op="-"  : mes2=sou
if a=3 : op="「" : mes2=takara
if a=4 : op="☆" : mes2=yuri
if a=5 : op="★" : mes2=otonasi
if a=6 : op="?"  : mes2=a2
if a=7 : op="【" : mes2=a4
if a=8 : op="!"  : mes2=a6

angel=bad+op+mes2

p1=angel
return stat
#global

HSP WindowにHELPボタンを追加する[修正版]

#include "user32.as"
#define WS_MINIMIZEBOX 0x00020000
#define WS_MAXIMIZEBOX 0x00010000;最初からついてないからいらない
#define WS_EX_CONTEXTHELP $00000400
GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat^(WS_MINIMIZEBOX);statにはGetWindowlongで取得した値が入るんだから使わないと。
GetWindowLong hwnd, -20
SetWindowLong hwnd, -20, stat^(WS_EX_CONTEXTHELP)
redraw 1;更新

HSP WindowにHELPボタンを追加する[エラーが出る]

	#include "user32.as"
	#define WS_EX_CONTEXTHELP $00000400L
	GetWindowLong hwnd, -16
	SetWindowLong hwnd, -16, WS_EX_CONTEXTHELP

	width 400, 200

HSP ペア比較マクロ

// コア
#define global ctype _pairOpPush2(%1, %2) %t_pairOp %s2 %s1	// 逆順 (%pN の N を(左:0→右:max)にするため)
#define global ctype _pairOpPush1(%1)     %t_pairOp %s1
#define global       _pairOpPop2          %t_pairOp %o0 %o0
#define global       _pairOpPop1          %t_pairOp %o0

// 展開後の式の形
#define global _pairEq2Impl %t_pairOp (%p0 == %p2 && %p1 == %p3)
#define global _pairNe2Impl %t_pairOp (%p0 != %p2 || %p1 != %p3)

#define global _pairOp2Impl %t_pairOp  %p0 %p4 %p2 , %p1 %p4 %p3

// { push, 展開式, pop }
#define global ctype _pairRel2(%1 = impl, %2 = args, %3) \
	_pairOpPush2 %3 _pairOpPush2 %2 \
	%1 \
	_pairOpPop2 _pairOpPop2

#define global ctype _pairOp2(%1 = impl, %2 = op, %3 = args, %4) \
	_pairOpPush1(%2) _pairOpPush2 %4 _pairOpPush2 %3  \
	%1 \
	_pairOpPop2 _pairOpPop2 _pairOpPop1

// public
#define global ctype pairEq(%1, %2) _pairRel2(_pairEq2Impl,  %1, %2)
#define global ctype pairNe(%1, %2) _pairRel2(_pairNe2Impl,  %1, %2)

#define global ctype pairOp(%1, %2 = op, %3) _pairOp2(_pairOp2Impl, %2,  %1, %3)

// テキトーなサンプル
#if 1
#define ctype dbgstr(%1)  ({"%1 = "} + (%1))
#define ctype dbgarr2(%1) ({"%1 = [ "} + %1(0) + ", " + %1(1) + " ]")

	a = 1
	b = 2
	mes dbgstr( pairEq((a, b), (1, 2)) )	// true
	mes dbgstr( pairNe((a, b), (3, 2)) )	// true

	x = pairOp( (1, 2), +, (3, 4) )	// ←見づらい
	mes dbgarr2( x )
#endif

/*
(a, b) を ctype マクロの引数にして、後は特殊展開マクロでよろしくやってるだけ
n-tuple について同様に可能
*/

HSP UserStream取得

#runtime "hsp3cl"

#packopt name "USA"

#module
#defcfunc strCnt str p1, str p2
	string = p1
	count=0 : i=-1
	repeat
		i = instr(string, i+1, p2)
		if i=-1 : break
		count++
	loop
	logmes "21"
return count

#deffunc getBlockStr str p1, int p2, int p3, var block, var other
	string = p1
	count= 0 : i=0
	sdim p2_s
	poke p2_s, 0, p2
	head=instr(string, 0, p2_s)
	if head=-1 : block="" : other=string : return block

	repeat ,head
		if peek(string, cnt)=$00 : return "-1"
		if peek(string, cnt)=p2 : count++
		if peek(string, cnt)=p3 : count--
		if count=0 : break
		i++
	loop

	block=strmid(string, head, i+1)
	other=strmid(string, head+i+1, strlen(string))
return block
#global

#include "TsubuyakiSoup.as"
#module UserStream

#uselib "crtdll.dll"
#func time "time" var

#uselib "wininet.dll"
#cfunc InternetOpen "InternetOpenA" sptr, int, sptr, sptr, int
#cfunc InternetOpenUrl "InternetOpenUrlA" int, str, sptr, int, int, int
#func InternetReadFile "InternetReadFile" int, var, int, var
#func InternetCloseHandle "InternetCloseHandle" int
#cfunc InternetConnect "InternetConnectA" int, str, int, sptr, sptr, int, int, int
#cfunc HttpOpenRequest "HttpOpenRequestA" int, sptr, str, sptr, sptr, sptr, int, int
#cfunc HttpSendRequest "HttpSendRequestA" int, sptr, int, sptr, int
#cfunc HttpQueryInfo "HttpQueryInfoA" int, int, var, var, int
#func InternetQueryDataAvailable "InternetQueryDataAvailable" int, int, int, int
#func InternetSetOption "InternetSetOptionA" int, int, int, int

#define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x2000
#define INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x1000

//------------------------------------------------------------
//OAuth認証を含めた、UserStreamの初期化
#deffunc UserStreamInit var p1, var p2, int p3, str p4, array p5
//  引数チェック&初期化
	sdim p1
	sdim p2
	API = p4
	if vartype(p5) != 2 : return 0
	hConnect = 0		//InternetConnectのハンドル
	hRequest = 0		//HttpOpenRequestのハンドル
	API_statcode = 0	//リクエストの結果コード
	API_p1Length = 0	//データ長
	API_rsize = 1024	//バッファ初期値
	API_hsize = 0		//取得したバイト数が代入される変数

	dup TS_AccessToken,TS_AccessToken@TsubuyakiSoup
	dup TS_Consumer_Key, TS_Consumer_Key@TsubuyakiSoup
	dup TS_Consumer_Secret,TS_Consumer_Secret@TsubuyakiSoup
	dup TS_AccessTokenSecret, TS_AccessTokenSecret@TsubuyakiSoup
	dup TS_RequestToken, TS_RequestToken@TsubuyakiSoup
	dup TS_RequestTokenSecret, TS_RequestTokenSecret@TsubuyakiSoup
//  メソッドの設定
	if (p3 = 1) {
		Method = "POST"
	} else {
		Method = "GET"
	}
//  ポート&フラグの設定
	UsePort = 443 : RequestFlag = -2147483648 | 0x800000 | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |INTERNET_FLAG_IGNORE_CERT_CN_INVALID : Scheme = "https"
	VersionStr = "2/"
	TokenStr = TS_AccessToken
	SigKey = TS_Consumer_Secret+" "+TS_AccessTokenSecret
	if (strmid(API,0,5) = "oauth") {
		VersionStr = ""
		if (API = "oauth/access_token") {
			repeat length(p5)
				if (p5(cnt) = "x_auth_mode=client_auth") : UsePort = 443 : RequestFlag = -2139082752 : Scheme = "https" : break
				if cnt = length(p5)-1 : TokenStr = TS_RequestToken : SigKey = TS_Consumer_Secret+" "+TS_RequestTokenSecret
			loop
		}
	}
//  シグネチャ生成
	SigArrayMax = 6 + length(p5)
	sdim SigArray, 500, SigArrayMax
	SigNonce = RandomString(8,32)
	time SigTime
	SigArray(0) = "oauth_consumer_key=" + TS_Consumer_Key
	SigArray(1) = "oauth_nonce=" + SigNonce
	SigArray(2) = "oauth_signature_method=HMAC-SHA1"
	SigArray(3) = "oauth_timestamp=" + SigTime
	SigArray(4) = "oauth_token="+ TokenStr
	SigArray(5) = "oauth_version=1.0"
	repeat SigArrayMax - 6
		SigArray(6+cnt) = p5(cnt)
	loop
	//ソート
	SortString SigArray
	//"&"で連結
	TransStr = ""+ Method +" "+ Scheme +"://userstream.twitter.com/"+ VersionStr + API +" "
	repeat SigArrayMax
		if SigArray(cnt) = "" : continue
		TransStr += SigArray(cnt) +"&"
	loop
	TransStr = strmid(TransStr, 0, strlen(TransStr)-1)
	Signature = SignatureEncode(TransStr, SigKey)
//  データ整形
	if (p3 = 1) {
		//POST
		PostStr = ""
		repeat SigArrayMax
			PostStr += SigArray(cnt) +"&"
		loop
		PostStr += "oauth_signature="+ Signature
		PostStrLen = strlen(PostStr)
		AddUrl = ""
	} else {
		//GET
		PostStr = 0
		PostStrLen = 0
		AddUrl = "?"
		repeat SigArrayMax
			AddUrl += SigArray(cnt) +"&"
		loop
		AddUrl += "oauth_signature="+ Signature
	}
	logmes TransStr
	//サーバへ接続
	hConnect = InternetConnect(TwiH_hInet@TsubuyakiSoup, "userstream.twitter.com", UsePort, 0, 0, 3, 0, 0)
	if (hConnect) {
		//リクエストの初期化
		hRequest = HttpOpenRequest(hConnect, Method, VersionStr+API+AddUrl, "HTTP/1.1", 0, 0, RequestFlag, 0)
		if (hRequest) {
			logmes VersionStr+API+AddUrl
			//サーバへリクエスト送信
			if ( HttpSendRequest(hRequest, 0, 0, PostStr, PostStrLen)) {
				API_statcode = 0
			} else {
				//サーバへリクエスト送信できなかった場合
				API_statcode = -2
			}
		} else {
			//Requestハンドルを取得できなかった場合
			API_statcode = -3
		}
		} else {
		//Connectハンドルを取得できなかった場合
		API_statcode = -4
	}
return API_statcode

//適当な部分もある、UserStreamのヘッダ取得
#deffunc getHead_US var p2
				//ヘッダを取得する変数の初期化
				p2Size = 3000
				sdim p2, p2Size
				//ヘッダの取得
				if ( HttpQueryInfo(hRequest, 22, p2, p2Size, 0) ) {
					//ヘッダの解析
					notesel p2
					repeat notemax
						noteget API_BufStr, cnt
						API_buf = instr(API_BufStr, 0, "Status: ")				//ステータスコード
						if (API_Buf != -1) : API_statcode = int(strmid(API_BufStr, API_buf+8, 3))
						API_buf = instr(API_BufStr, 0, "Content-Length: ")		//長さ
						if (API_Buf != -1) : API_p1Length = int(strmid(API_BufStr, -1, strlen(API_BufStr)-API_buf+16))
						API_buf = instr(API_BufStr, 0, "X-RateLimit-Limit: ")		//60分間にAPIを実行できる回数
						if (API_Buf != -1) : TS_RateLimit(0) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+19)))
						API_buf = instr(API_BufStr, 0, "X-RateLimit-Remaining: ")	//APIを実行できる残り回数
						if (API_Buf != -1) : TS_RateLimit(1) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+23)))
						API_buf = instr(API_BufStr, 0, "X-RateLimit-Reset: ")		//リセットする時間
						if (API_Buf != -1) : TS_RateLimit(2) = int(strmid(API_BufStr, -1, strlen(API_BufStr)-(API_buf+19)))
					loop
					noteunsel
				} else {
					//ヘッダの取得ができなかった場合
					API_statcode = -1
				}
return API_statcode

//適当な部分もある、UserStreamのデータ取得
#deffunc getBody_US var p1
				wait 10
				p2Size = 3000
				sdim p2, p2Size
					//入手可能なデータ量を取得
					InternetQueryDataAvailable hRequest, varptr(API_rsize), 0, 0
					//バッファの初期化
					sdim API_bufStr, API_rsize+1
					sdim p1, API_rsize+1
					repeat
						InternetReadFile hRequest, API_bufStr, API_rsize, API_hsize
						p1 += strmid(API_bufStr, 0, API_hsize)
						wait 10
						if (API_hsize = 1)||(API_hsize!API_rsize)||(API_hsize=0) : break
					loop

return API_statcode

#global

#uselib "KERNEL32.DLL"
#cfunc OpenProcess "OpenProcess" int,int,int
#func GetExitCodeProcess "GetExitCodeProcess" int,int
#define PROCESS_QUERY_INFORMATION $400	//OpenProcess時に使う。

//コマンドライン解析用。http://lldev.jp/hsp/tips/miscellaneous.html#cmdlineprmsからDLしてください。
#include "cmdline_parser/gm_cmdline_parser.hsp"

;サンプル用設定ファイル
#include "SampleSetting.hsp"
if CONSUMER_KEY = "" : mes "「SampleSetting.hsp」でConsumerKeyとConsumerSecretを設定してください。" : end

	if getarg(0,1)="" : mes "USA: 引数が不正です。" : end		//引数が一つもない状態

	// 初期化
	TS_Init "TsubuyakiSoup Sample", CONSUMER_KEY, CONSUMER_SECRET, 20

	// 設定ファイルの有無確認
	xToken = ""
	xSecret = ""
	exist "Setting.txt"
	if strsize != -1 {
		notesel SFA
		noteload "Setting.txt"
		if (Decryption(SFA, "SampleKey")=0) : dialog "ファイルの復号に失敗したため、読み込むことができませんでした。終了します。" : end
		noteget xToken,0
		noteget xSecret,1
		noteunsel
		SetAccessToken xToken, xSecret
	}
	if ( (xToken ="") or (xSecret = "") ) : dialog "「Sample01_OAuth.hsp」か「Sample02_xAuth.hsp」を実行して「Setting.txt」を作成してください。" : end

	repeat						//コマンドラインの2~の要素を、UserStreamAPIに対しての引数とする。
		if getarg(cnt+2,1)="" : break
		Arg.cnt = getarg(cnt+2,1)
	loop
	parentpid = int(getarg(1,1))
	hParent=OpenProcess(PROCESS_QUERY_INFORMATION, 0, parentpid)	//親プロセス実行状況確認時に使う。
	if hParent=0 : mes "USA: error "+__LINE__ : wait 500 : end		//OpenProcessが実行できなかった場合。

	api = getarg(0,1)
	UserStreamInit body, head, 0, api, Arg	; HTTPS

	buf=""
*main
	;	結果待ちのためのループ
	wait 100

	getBody_US body
	buf+=body
	gosub *comp

	exitcode = 0
	GetExitCodeProcess hParent, varptr(exitcode)	//親プロセスの実行状況確認
	if exitcode!$103 : goto *exit					//親プロセスが閉じられていたら、*exitへ。
	wait 30
	goto *main

*exit
	//親プロセスが閉じられたっぽい。
	mes "USA: exit"
	wait 500
	end

*comp
	;	完了
	getBlockStr body, '{', '}', block, buf	//bodyの{と}の間をブロックとしてblockに格納、余ったごみをbufへ。
	mes block
	return

HSP [初心者用] 文字色を変更しながら表示するサンプル

;
;ちらちらなしで文字を表示させるサンプル
;

	screen 0,500,300,,(ginfo_dispx-500)/2,(ginfo_dispy-300)/2

	repeat				;repeat-loop で無限ループを作成
	redraw 0			;画面の更新をいったん停止

	font"tahoma",30,17		;書式を定義
	pos -1000,-1000:mes"TEXT"	;文字サイズを取得するために見えないところに文字を表示

	size_x=ginfo_mesx
	size_y=ginfo_mesy

	hsvcolor cnt*2,255,255		;文字色を定義
	pos (500-size_x)/2,(300-size_y)/2:mes"TEXT"

	redraw 1			;描画開始
	wait 5				;少し待つ ※これがないと応答なしになります
	loop				;repeatのところに戻る

HSP HSPのテスト

;
#ifdef __hsp30__
#define objselstr(%1,%2,%3) vvv=%3: sendmsg objinfo(%1,2),177,%2,varptr(vvv)
#define getact(%1) %1=ginfo_act
#else
#define ginfo_dispx dispx
#define ginfo_dispy dispy
#define objselstr(%1,%2,%3) vvv=%3: objsend %1,177,%2,vvv,1
#define getact(%1) ginfo 1: %1=prmx
#endif
	fsize=8
	pos 4,8: mes "チーム数:"
	pos 88,4: input nteam
	pos 4,32: button "表示", *l_disp
	objsel 0: objselstr 0,0,-1
*l_loop
	repeat: wait 10
		getact act
		if act==0 {
			stick key,,1
			if key==32:break
		}
		if act!=act2 {
			if act==0 {
				gsel 0
				objsel 0
				c=-1
				objselstr 0,0,-1
			}
			act2=act
		}
	loop

*l_disp
	if nteam<2: dialog "チーム数は2以上にしてください。": goto *l_loop
	beki=1
	nbeki=0
	repeat
		beki=beki*2
		nbeki++
		if beki>=nteam: break
	loop
	marg=4
	w2=fsize+marg
	wid=beki*w2
	if wid<128: wid=128	;HSPのバグ回避
	heit=(nbeki+1)*16
	if wid>ginfo_dispx {
		screen 2,wid,heit,,0,(ginfo_dispy-heit)/2,ginfo_dispx-6,heit
	} else {
		screen 2,wid,heit,,(ginfo_dispx-wid)/2,(ginfo_dispy-heit)/2
	}
	fusen=beki-nteam
	fusen2=fusen
	nw=beki
	bk=1
	iv=0
	y=0
	ww=nw*w2-marg
	repeat nbeki
		;縦線
		gosub *l_vert
		nw=nw/2
		ww=nw*w2-marg
		;横線
		gosub *l_hor
		bk=bk*2
		iv++
		y+=16
	loop
	;縦線
	gosub *l_vert2
goto *l_loop

;縦線
*l_vert
	x=ww/2
	repeat bk
		line x,y,x,y+15
		x+=nw*w2
	loop
return

;縦線2
*l_vert2
	x=ww/2
	repeat bk
		if cnt\2 {	;奇数のとき
			if fusen<1 {
				line x,y,x,y+15
			} else {
				c=fsize/2
				line x-c-2,y-1,x-c-2,y+15
				fusen--
			}
		} else {	;偶数のとき
			if fusen<1 {
				line x,y,x,y+15
			}
		}
		x+=nw*w2
	loop
return

;横線
*l_hor
	x=ww/2-1
	repeat bk
		if nw>1 | (fusen2<1) {
			line x,y+16,nw*w2+x+1,y+16
		}
		if nw==1: if fusen2: fusen2--
		x+=nw*w2*2
	loop
return
Total Pages: 22 / 22« 先頭...101819202122

よく投稿されているコード

タグ

最近投稿されたコード