作者bluesway.bbs@bluesway.tfcis.org (雲淡風輕) 看板: plan
標題cygwin 相簿功能
時間蓽路小築 (2005/07/20 Wed 21:13:20) Updated: 2005/07/20
因為精華區裡的 BBS 帳號與相簿同步 一直弄不起來
加上想多些功能
就自己寫了一支程式
使用者自己決定要不要開相簿
還可以花錢買相簿的空間 (不然有錢都沒地方花)
要先利用 AppServ 架站,再架設 Coppermine Photo Gallery
以下程式設計在 cygwin 中運作
其它作業系統可能有些地方要自己修正一下
另外,我的功力很淺,可能程式運作效率不是很好
歡迎高手指正修改 :)
: maple/menu.c 適當選項中加入
+ main_album, PERM_BASIC, M_GAME,
+ "Gallery ♂ 設定相簿 ♀",
: maple/Makefile
SRC =
../so/jcee.c ../so/dict.c ../so/lottery.c ../so/album.c \
OBJ =
../so/jcee.o ../so/dict.o ../so/lottery.o ../so/album.o \
: maple/bbsd.c:belong_list() 拿掉 static
- static int /* 1:在list中 0:不在list中 */
+ int /* 1:在list中 0:不在list中 */
belong_list(filelist, key, desc)
: maple/maple.p
/* bbsd.c */
+ int belong_list(char *filelist, char *key, char *desc);
...
/* so */
+ int main_album();
: include/global.h
#define FN_ETC_LOVELETTER "etc/loveletter" /* 情書產生器文庫 */
#define FN_ETC_CLASS "etc/class" /* 看板分類顏色 */
+ #define FN_ETC_ALBUM "etc/album" /* 相簿 */
...
/* ----------------------------------------------------- */
/* 訊息字串:獨立出來,以利支援各種語言 */
/* ----------------------------------------------------- */
+ #define MYSQL_PATH "/cygdrive/c/AppServ/mysql/bin/mysql"
+ /* MySQL 執行檔的路徑 */
+ #define ROOTPASS "bedbtkbryowtdemrcouwxkatieixhxgns"
+ /* MySQL 管理者密碼 */
: maple/acct.c:acct_setup() 改密碼時順便改相簿密碼
acct_setup(u, adm)
ACCT *u;
int adm;
{
ACCT x;
int i, num;
char *str, buf[80], pass[PSWDLEN + 1];
+ char cmd[256], quota[27]
...
vget(i + 1, 0, "檢查新密碼:", buf, PSWDLEN + 1, NOECHO);
if (!strcmp(buf, pass))
{
str_ncpy(x.passwd, genpasswd(buf), sizeof(x.passwd));
+ if (belong_list(FN_ETC_ALBUM, x.userid, quota))
+ {
+ sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;"
+ "Update cpg132_users Set user_password=\'%s\' "
+ "Where user_name=\'%s\';\"", buf, x.userid);
+ system(cmd);
+ }
break;
}
: so/album.c 新增此程式
/*-------------------------------------------------------*/
/* so/album.c ( NTHU CS MapleBBS Ver 3.10 ) */
/*-------------------------------------------------------*/
/* target : 相簿功能 */
/* create : 05/06/06 */
/* author : bluesway@tfcis.org */
/*-------------------------------------------------------*/
#include "bbs.h"
#if 0
本程式假設 AppServ 是按照預設路徑安裝 (不是的話要改 MYSQL_PATH)
cpg 資料庫的相關設定也都按照預設值來安裝
在 cpg 資料庫中,每個使用者各自成一個 group (才能改 quota)
並以 userno 當作 group id
使用者可以用的空間限制記錄在 FN_ETC_ALBUM
#endif
#define P_ALBUM 50000 /* 每本相簿的價格 */
#define P_BQUOTA 10 /* 每買 1KB 相簿空間的價格 */
#define P_SQUOTA 8 /* 每賣 1KB 相簿空間的價格 */
#define QUOTA 10240 /* 預設的相簿空間 (KB) */
static int
album_create()
{
char passwd[PSWDLEN + 1], regtime[50], cmd[200];
struct tm *local;
time_t now;
FILE *fp;
/* regtime 借來填一下參數 */
if (!belong_list(FN_ETC_ALBUM, cuser.userid, regtime))
{
sprintf(cmd, "買相簿需要花 %d 銀幣喔!", P_ALBUM);
vmsg(cmd);
if (cuser.money < 50000 || vans("確定要買嗎?[Y/n]") == 'n')
return XO_FOOT;
}
else
{
vmsg("您已經有相簿了!");
return XO_FOOT;
}
vget(b_lines, 0, "◆ 請輸入密碼確認:", passwd, PSWDLEN + 1, NOECHO);
if (chkpasswd(cuser.passwd, passwd))
{
vmsg("Sorry..密碼有誤!");
return XO_FOOT;
}
local = localtime(&now);
time(&now);
sprintf(regtime, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", local->tm_year + 1900,
local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min,
local->tm_sec);
if (!HAS_PERM(PERM_SYSOP)) /* 站長一定是 CPG 管理員群組,不必另建群組 */
{
sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;Insert "
"cpg132_usergroups(group_id,group_name) Values(%d,\'%s\');\"",
cuser.userno, cuser.userid);
system(cmd);
}
sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;Insert "
"cpg132_users(user_group,user_name,user_password,user_regdate) "
"Values(%d,\'%s\',\'%s\',\'%s\');\"",
(HAS_PERM(PERM_SYSOP) ? 1 : cuser.userno), cuser.userid,
passwd, regtime);
system(cmd);
fp = fopen(FN_ETC_ALBUM, "a");
/* 站長不需要限制 quota */
fprintf(fp, "%s %d\n", cuser.userid, (HAS_PERM(PERM_SYSOP) ? 0 : QUOTA));
fclose(fp);
/* 站長買相簿不用錢 */
cuser.money -= HAS_PERM(PERM_SYSOP) ? 0 : P_ALBUM;
/* 借 regtime 和 cmd 來 秀訊息 */
sprintf(regtime, "%.3f MB", QUOTA / 1024.0);
sprintf(cmd, "相簿建立完成!祝使用愉快..您目前有可用空間 %s。",
(HAS_PERM(PERM_SYSOP) ? "無限大" : regtime));
vmsg(cmd);
}
static int
album_buyquota()
{
int num, update;
char buf[50], quota[27], cmd[200], fpath[64];
FILE *fpr, *fpw;
if (!belong_list(FN_ETC_ALBUM, cuser.userid, quota))
{
vmsg("您尚未購買相簿喔!");
return XO_FOOT;
}
sprintf(cmd, "相簿空間 %d銀 / KBytes,您要買多少 KB 呢?", P_BQUOTA);
if (!vget(b_lines, 0, cmd, buf, 11, DOECHO))
return XO_FOOT;
num = atoi(buf);
if (cuser.money < num * P_BQUOTA)
{
vmsg("您的現金不足!");
return XO_FOOT;
}
update = atoi(quota) + num;
if (update < 0)
{
vmsg("您沒有足夠空間可以釋出");
return XO_FOOT;
}
sprintf(cmd, MYSQL_PATH" -p"ROOTPASS" -e \"use cpg132;"
"Update cpg132_usergroups Set group_quota=%d "
"Where group_name=\'%s\';\"", update, cuser.userid);
system(cmd);
fpr = fopen(FN_ETC_ALBUM, "r");
sprintf(fpath, "%s.tmp", FN_ETC_ALBUM);
fpw = fopen(fpath, "w");
/* 借用 cmd, buf 來更新資料 */
while (fgets(cmd, sizeof(cmd), fpr))
{
if (strstr(cmd, cuser.userid))
{
sprintf(buf, "%s %d\n", cuser.userid, update);
strcpy(cmd, buf);
}
fputs(cmd, fpw);
}
fclose(fpw);
fclose(fpr);
unlink(FN_ETC_ALBUM);
rename(fpath, FN_ETC_ALBUM);
cuser.money -= num < 0 ? num * P_SQUOTA : num * P_BQUOTA;
if (num >= 0)
sprintf(cmd, "購買 %d KB,花費 %d 銀幣!您目前可使用的空間是 %.3f MB。",
num, num * P_BQUOTA, update / 1024.0);
else
sprintf(cmd, "釋出 %d KB,換回 %d 銀幣!您目前可使用的空間是 %.3f MB。",
num * -1, num * P_SQUOTA * -1, update / 1024.0);
vmsg(cmd);
}
int
main_album()
{
int ans;
switch (ans = vans("◎ 相簿 1)建立相簿 2)購買容量?[Q] "))
{
case '1':
album_create();
break;
case '2':
if (!HAS_PERM(PERM_SYSOP)) /* 站長不需要 */
album_buyquota();
break;
default:
return XEASY;
}
}
--
你已經明瞭了嗎?那就去做吧!
--
◢◣戚戚於簡短的 bluesway.tfcis.org 我無法言語孤獨強襲上 蓽路小築
◥◤幻化為囹圄中一抹 bluesway 的淡影我找不到出口回到 218-171-208-186.dynamic.