From 7852572f26e28aa552d2eadd44f077849f1d1979 Mon Sep 17 00:00:00 2001 From: tobiichi3227 <86729076+tobiichi3227@users.noreply.github.com> Date: Thu, 12 Dec 2024 22:48:21 +0800 Subject: [PATCH] Feat: Add support for cyclical dates in special events to avoid yearly updates (#45) * Feat(fortune): add static date and cyclical date support * Chore(Fortune): convert static event date to cyclical date * Docs: Update CONTRIBUTING.md * Chore(Fortune): Remove old special events * Fix(Fortune): Correctly set the trigger date for Thanksgiving * Impr(fortune): Make the code more readable by reducing duplication and lengthy validation blocks Additionally, strengthen the handling of edge cases (e.g., 31 in February). * Impr(fortune): Separate the default and user-defined events into different files for easier identification and management * Docs: Update CONTRIBUTING.md * Impr(fortune): Simplify events file categorization * Docs: Update CONTRIBUTING.md * Docs: Update CONTRIBUTING.md --- CONTRIBUTING.md | 47 +- fortune_generator/js/fortune.js | 123 +++- fortune_generator/json/custom_special.json | 3 + fortune_generator/json/cyclical_special.json | 726 +++++++++++++++++++ fortune_generator/json/special.json | 346 ++++----- fortune_generator/json/static_special.json | 46 ++ 6 files changed, 1081 insertions(+), 210 deletions(-) create mode 100644 fortune_generator/json/custom_special.json create mode 100644 fortune_generator/json/cyclical_special.json create mode 100644 fortune_generator/json/static_special.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a9d9c5a..335db40 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,16 +34,57 @@ 4. Maintain a positive and encouraging tone. ### Special Events +#### Date Structure +1. With year, month and date + ```json + "triggerDate": { + "year": "Year", + "month": "Month", + "date": "Date" + } + ``` + We should place events of this type in the `fortune_generator/json/custom_special.json`. + + For one-time or irregular events, or events with complex date calculations (like the Moon Festival in the lunar calendar). + + **NOTE: Any special event that does not fit into either** + - Static events (fixed date every year) + - Cyclical events (recurring on a pattern like "fourth Thursday") + +2. With only month and day + ```json + "triggerDate": { + "month": "Month", + "date": "Date" + } + ``` + + We should place events of this type in the `fortune_generator/json/static_special.json`. + + For events with fixed dates. + +3. With only month, week, weekday (like Mother's Day) + ```json + "triggerDate": { + "month": "Month", + "week": "Week", + "weekday": "Weekday" + } + ``` + + We should place events of this type in the `fortune_generator/json/cyclical_special.json`. + + For recurring events (e.g., holidays like Thanksgiving and Mother's Day). + +#### Event Structure Special events require a more detailed structure. 1. Structure: ```json { "event": "Event Name", - "year": "Year", - "month": "Month", - "date": "Date", + "triggerDate": {}, // Please refer to explaination above "status_index": "Status Index", "goodFortunes": { "l_1_event": "Good Fortune 1", diff --git a/fortune_generator/js/fortune.js b/fortune_generator/js/fortune.js index 58664cb..788ea69 100644 --- a/fortune_generator/js/fortune.js +++ b/fortune_generator/js/fortune.js @@ -35,11 +35,17 @@ async function fetch_data() { badFortunes = data.badFortunes; }); - await fetch("./json/special.json") - .then((response) => response.json()) - .then((data) => { - special_events = data.special_events; - }); + async function fetch_events(path) { + await fetch(path) + .then((response) => response.json()) + .then((data) => { + special_events.push(...data.special_events); + }); + } + + await fetch_events("./json/custom_special.json"); + await fetch_events("./json/static_special.json"); + await fetch_events("./json/cyclical_special.json"); } const textColorClass = [ @@ -92,13 +98,91 @@ const day = d.getDay(); const month = d.getMonth() + 1; const year = d.getFullYear(); +function validateNumber(value, min, max, fieldName, event) { + value = parseInt(value); + if (isNaN(value) || value < min || value > max) { + console.warn(`illegal event: ${fieldName} should be between ${min} and ${max}`, event); + return null; + } + return value; +} + +function isLeapYear(year) { + if (year % 400 === 0) return true; + if (year % 100 === 0) return false; + if (year % 4 === 0) return true; + return false; +} + +const daysPerMonth = [ + 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 +]; +const maxDate = new Date(8640000000000000); + function daysDiff(eventIndex) { // define the date right now and the special event date + const event = special_events[eventIndex]; const startDate = new Date(year, month - 1, date); + let eventYear = -1, eventMonth = -1, eventDate = -1; + if (!('triggerDate' in event)) { + console.warn('illegal event: missing `triggerDate` field', event); + return -1; + } else if (Object.prototype.toString.call(event.triggerDate) !== "[object Object]") { + console.warn('illegal event: `triggerDate` field should be a json object', event); + return -1; + } + const triggerDate = event.triggerDate; + + eventYear = year; + if ('year' in triggerDate) { + eventYear = validateNumber(triggerDate.year, 1, maxDate.getFullYear(), 'triggerDate.year', event); + if (eventYear === null) { + return -1; + } + } + + if (!('month' in triggerDate)) { + console.warn('illegal event: `triggerDate` missing `month` field', event); + return -1; + } + eventMonth = validateNumber(triggerDate.month, 1, 12, 'triggerDate.Month', event); + if (eventMonth === null) { + return -1; + } + + if (!('date' in triggerDate) && (!('week' in triggerDate) || !('weekday' in triggerDate))) { + console.warn('illegal event: `triggerDate` require (`week` and `weekday`) or `date` field', event); + return -1; + } + + if ('date' in triggerDate) { + let days = daysPerMonth[eventMonth]; + if (isLeapYear(eventYear) && eventMonth == 2) days += 1; + eventDate = validateNumber(triggerDate.date, 1, days, 'triggerDate.date', event); + if (eventDate === null) { + return -1; + } + } else { + + triggerDate.week = validateNumber(triggerDate.week, 1, 5, 'triggerDate.week', event); + triggerDate.weekday = validateNumber(triggerDate.weekday, 1, 7, 'triggerDate.weekday', event); + if (triggerDate.week === null || triggerDate.weekday === null) { + return -1; + } + + const firstDayOfMonth = new Date(eventYear, eventMonth - 1, 1); + const firstDayWeekday = firstDayOfMonth.getDay(); + + // Sunday -> 7 + const adjustedFirstDayWeekday = firstDayWeekday === 0 ? 7 : firstDayWeekday; + const firstTargetDay = 1 + (triggerDate.weekday - adjustedFirstDayWeekday + 7) % 7; + eventDate = firstTargetDay + (triggerDate.week - 1) * 7; + } + const endDate = new Date( - special_events[eventIndex].year, - special_events[eventIndex].month - 1, - special_events[eventIndex].date, + eventYear, + eventMonth - 1, + eventDate, ); // calculate the difference in milliseconds and convert it to days @@ -146,18 +230,23 @@ async function init_page() { $("#weekday").html(showDay); const showSpecialEventCount = 2; - let eventIndexPtr = 0, eventIndexList = Array(showSpecialEventCount).fill(-1); + let eventIndexList = Array(showSpecialEventCount).fill(-1); + let eventDiffDaysIndexList = Array(showSpecialEventCount).fill(Number.MAX_SAFE_INTEGER); + // check if there is special event today for (let i = 0; i < special_events.length; i++) { - if (daysDiff(i) > 0) { - if ( - eventIndexPtr < showSpecialEventCount && - eventIndexList[eventIndexPtr] == -1 - ) { - eventIndexList[eventIndexPtr] = i; - eventIndexPtr++; + let diffCount = daysDiff(i); + if (diffCount > 0) { + let j = 0; + for (; j < showSpecialEventCount; j++) { + if (diffCount < eventDiffDaysIndexList[j]) { + break; + } } - } else if (daysDiff(i) == 0) { + + eventDiffDaysIndexList[j] = diffCount; + eventIndexList[j] = i; + } else if (diffCount === 0) { special = true; special_events_index = i; } diff --git a/fortune_generator/json/custom_special.json b/fortune_generator/json/custom_special.json new file mode 100644 index 0000000..ff81a74 --- /dev/null +++ b/fortune_generator/json/custom_special.json @@ -0,0 +1,3 @@ +{ + "special_events": [] +} diff --git a/fortune_generator/json/cyclical_special.json b/fortune_generator/json/cyclical_special.json new file mode 100644 index 0000000..ee429f0 --- /dev/null +++ b/fortune_generator/json/cyclical_special.json @@ -0,0 +1,726 @@ +{ + "special_events": [ + { + "event": "元旦", + "triggerDate": { + "month": "1", + "date": "1" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "早起", + "l_1_desc": "心情愉悅迎接新年", + "l_2_event": "大掃除", + "l_2_desc": "新年新氣象" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際資料隱私日", + "triggerDate": { + "month": "1", + "date": "28" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "整理資料", + "l_1_desc": "注意在線資料安全", + "l_2_event": "注意隱私", + "l_2_desc": "謹慎上網" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "植樹節", + "triggerDate": { + "month": "3", + "date": "12" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "植樹造林", + "l_1_desc": "保護生態、美化環境", + "l_2_event": "節能減碳", + "l_2_desc": "延長資源壽命" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "白色情人節", + "triggerDate": { + "month": "3", + "date": "14" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "送禮物", + "l_1_desc": "表達愛意和感激之情", + "l_2_event": "觀星", + "l_2_desc": "仰望星空,共描明月" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界森林日", + "triggerDate": { + "month": "3", + "date": "21" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "環境教育", + "l_1_desc": "提升對自然的敬重", + "l_2_event": "節約用水", + "l_2_desc": "保護生態系統穩定" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "愚人節", + "triggerDate": { + "month": "4", + "date": "1" + }, + "status_index": "3", + "goodFortunes": { + "l_1_event": "喜笑顏開", + "l_1_desc": "與親朋好友分享快樂", + "l_2_event": "開派對", + "l_2_desc": "組織有趣的活動和遊戲" + }, + "badFortunes": { + "r_1_event": "冒犯他人", + "r_1_desc": "避免製造觸怒人的笑話", + "r_2_event": "惡作劇", + "r_2_desc": "注意避免不必要的麻煩" + } + }, + { + "event": "兒童節", + "triggerDate": { + "month": "4", + "date": "4" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "喜笑顏開", + "l_1_desc": "與親朋好友分享快樂", + "l_2_event": "開派對", + "l_2_desc": "組織有趣的活動和遊戲" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界健康日", + "triggerDate": { + "month": "4", + "date": "7" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "健康飲食", + "l_1_desc": "多攝取水果、蔬菜和全穀食品", + "l_2_event": "運動鍛煉", + "l_2_desc": "保持身體健康和活力" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界地球日", + "triggerDate": { + "month": "4", + "date": "22" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "環保行動", + "l_1_desc": "參與植樹造林或垃圾回收等環保行動", + "l_2_event": "節能減排", + "l_2_desc": "選擇環保型交通工具" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界閱讀日", + "triggerDate": { + "month": "4", + "date": "23" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "推廣閱讀", + "l_1_desc": "激發對知識的渴望", + "l_2_event": "書籍分享", + "l_2_desc": "與他人分享你的書單" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界智慧財產權日", + "triggerDate": { + "month": "4", + "date": "26" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "保護創意", + "l_1_desc": "尊重他人的創意和智慧財產權,共同維護創作人的權益", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "星際大戰日", + "triggerDate": { + "month": "5", + "date": "04" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "電影馬拉松", + "l_1_desc": "播放所有星際大戰電影", + "l_2_event": "感受原力", + "l_2_desc": "May the force be with you, always." + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界微笑日", + "triggerDate": { + "month": "5", + "date": "08" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "微笑", + "l_1_desc": "用微笑向世界問好", + "l_2_event": "放慢腳步", + "l_2_desc": "觀察四周的美好事物" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "母親節", + "triggerDate": { + "month": "5", + "week": "2", + "weekday": "7" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "家庭聚餐", + "l_1_desc": "表達對媽媽的感恩之心", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界環境日", + "triggerDate": { + "month": "6", + "date": "05" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "少用塑膠", + "l_1_desc": "選擇可重複使用的替代品", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界獻血者日", + "triggerDate": { + "month": "6", + "date": "14" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "捐血", + "l_1_desc": "捐出血液和血漿,分享生命要時常", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "巧克力日", + "triggerDate": { + "month": "7", + "date": "07" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "送巧克力", + "l_1_desc": "共享巧克力盛宴", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "宅宅日", + "triggerDate": { + "month": "7", + "date": "13" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "觀影", + "l_1_desc": "看心愛的電影或影集", + "l_2_event": "閱讀", + "l_2_desc": "享受片刻的寧靜" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際冷笑話日", + "triggerDate": { + "month": "7", + "date": "24" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "講冷笑話", + "l_1_desc": "一起嘻嘻哈哈", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際友誼日", + "triggerDate": { + "month": "7", + "date": "30" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "與朋友聯絡", + "l_1_desc": "回憶美好時光", + "l_2_event": "一起出遊", + "l_2_desc": "增進彼此的感情" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際左撇子日", + "triggerDate": { + "month": "8", + "date": "13" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "挑戰新事物", + "l_1_desc": "嘗試用左手完成任務", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界攝影日", + "triggerDate": { + "month": "8", + "date": "19" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "拍攝照片", + "l_1_desc": "捕捉生活中的美好瞬間", + "l_2_event": "分享作品", + "l_2_desc": "展示您的攝影技巧" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際狗狗日", + "triggerDate": { + "month": "8", + "date": "26" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "陪伴狗狗", + "l_1_desc": "帶狗狗散步或遊玩", + "l_2_event": "分享作品", + "l_2_desc": "展示您的攝影技巧" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際慈善日", + "triggerDate": { + "month": "9", + "date": "5" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "捐贈物資", + "l_1_desc": "捐贈物資或金錢,幫助有需要的人", + "l_2_event": "參與志願活動", + "l_2_desc": "參加社區慈善活動,提升社會貢獻" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "國際和平日", + "triggerDate": { + "month": "9", + "date": "21" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "分享愛心", + "l_1_desc": "與他人分享關懷與愛心,促進和平", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "教師節", + "triggerDate": { + "month": "9", + "date": "28" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "感謝老師", + "l_1_desc": "向老師表達感謝,增進師生情誼", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "世界糧食日", + "triggerDate": { + "month": "10", + "date": "16" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "節約糧食", + "l_1_desc": "支持可持續的食物系統", + "l_2_event": "捐贈食品", + "l_2_desc": "捐贈食物給有需要的人,傳遞愛心" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "聯合國日", + "triggerDate": { + "month": "10", + "date": "24" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "支持和平", + "l_1_desc": "參與促進世界和平的活動", + "l_2_event": "了解國際事務", + "l_2_desc": "增強全球視野" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "萬聖節", + "triggerDate": { + "month": "10", + "date": "31" + }, + "status_index": "4", + "goodFortunes": { + "l_1_event": "扮演角色", + "l_1_desc": "穿上喜愛的角色服裝,享受萬聖節的氛圍", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "忽略安全", + "r_2_desc": "活動時忽視安全措施可能帶來風險" + } + }, + { + "event": "世界善心日", + "triggerDate": { + "month": "11", + "date": "13" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "善待他人", + "l_1_desc": "在生活中多一些善意與寬容", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "感恩節", + "triggerDate": { + "month": "11", + "week": "4", + "weekday": "4" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "家人團聚", + "l_1_desc": "分享寶貴時光", + "l_2_event": "吃火雞大餐", + "l_2_desc": "Happy Thanksgiving!" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "棉花糖日", + "triggerDate": { + "month": "12", + "date": "07" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "吃棉花糖", + "l_1_desc": "慶祝棉花糖日", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "貓奴日", + "triggerDate": { + "month": "12", + "date": "15" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "嚕貓", + "l_1_desc": "撫平傷心的心情", + "l_2_event": "喝咖啡", + "l_2_desc": "到貓咪咖啡店去喝咖啡" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "冬至", + "triggerDate": { + "month": "12", + "date": "22" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "吃湯圓", + "l_1_desc": "團團圓圓", + "l_2_event": "保暖", + "l_2_desc": "冬至到了" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "平安夜", + "triggerDate": { + "month": "12", + "date": "24" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "除舊佈新", + "l_1_desc": "平安祥和", + "l_2_event": "交換禮物", + "l_2_desc": "獲得真心的祝福" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "聖誕節", + "triggerDate": { + "month": "12", + "date": "25" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "家庭聚會", + "l_1_desc": "一起團圓吃火雞大餐", + "l_2_event": "注意保暖", + "l_2_desc": "冬至到了" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + } + ] +} diff --git a/fortune_generator/json/special.json b/fortune_generator/json/special.json index 4242a15..3f7a451 100644 --- a/fortune_generator/json/special.json +++ b/fortune_generator/json/special.json @@ -2,9 +2,11 @@ "special_events": [ { "event": "感恩節", - "year": "2023", - "month": "11", - "date": "23", + "triggerDate": { + "month": "11", + "week": "4", + "weekday": "4" + }, "status_index": "0", "goodFortunes": { "l_1_event": "家人團聚", @@ -21,9 +23,10 @@ }, { "event": "棉花糖日", - "year": "2023", - "month": "12", - "date": "07", + "triggerDate": { + "month": "12", + "date": "07" + }, "status_index": "0", "goodFortunes": { "l_1_event": "吃棉花糖", @@ -40,9 +43,10 @@ }, { "event": "貓奴日", - "year": "2023", - "month": "12", - "date": "15", + "triggerDate": { + "month": "12", + "date": "15" + }, "status_index": "0", "goodFortunes": { "l_1_event": "嚕貓", @@ -59,9 +63,10 @@ }, { "event": "冬至", - "year": "2023", - "month": "12", - "date": "22", + "triggerDate": { + "month": "12", + "date": "22" + }, "status_index": "0", "goodFortunes": { "l_1_event": "吃湯圓", @@ -78,9 +83,10 @@ }, { "event": "平安夜", - "year": "2023", - "month": "12", - "date": "24", + "triggerDate": { + "month": "12", + "date": "24" + }, "status_index": "0", "goodFortunes": { "l_1_event": "除舊佈新", @@ -97,9 +103,10 @@ }, { "event": "聖誕節", - "year": "2023", - "month": "12", - "date": "25", + "triggerDate": { + "month": "12", + "date": "25" + }, "status_index": "0", "goodFortunes": { "l_1_event": "家庭聚會", @@ -116,9 +123,10 @@ }, { "event": "元旦", - "year": "2024", - "month": "1", - "date": "1", + "triggerDate": { + "month": "1", + "date": "1" + }, "status_index": "0", "goodFortunes": { "l_1_event": "早起", @@ -133,68 +141,12 @@ "r_2_desc": "" } }, - { - "event": "學測 Day 1", - "year": "2024", - "month": "1", - "date": "20", - "status_index": "0", - "goodFortunes": { - "l_1_event": "考試", - "l_1_desc": "如願以償,金榜題名", - "l_2_event": "祈禱", - "l_2_desc": "獲得平安、信心" - }, - "badFortunes": { - "r_1_event": "", - "r_1_desc": "", - "r_2_event": "", - "r_2_desc": "" - } - }, - { - "event": "學測 Day 2", - "year": "2024", - "month": "1", - "date": "21", - "status_index": "0", - "goodFortunes": { - "l_1_event": "參加測驗", - "l_1_desc": "天道酬勤", - "l_2_event": "安心", - "l_2_desc": "事事順利、心想事成" - }, - "badFortunes": { - "r_1_event": "", - "r_1_desc": "", - "r_2_event": "", - "r_2_desc": "" - } - }, - { - "event": "學測 Day 3", - "year": "2024", - "month": "1", - "date": "22", - "status_index": "0", - "goodFortunes": { - "l_1_event": "決戰巔峰", - "l_1_desc": "縱橫考場斬關將", - "l_2_event": "成功", - "l_2_desc": "勢在必得" - }, - "badFortunes": { - "r_1_event": "", - "r_1_desc": "", - "r_2_event": "", - "r_2_desc": "" - } - }, { "event": "國際資料隱私日", - "year": "2024", - "month": "1", - "date": "28", + "triggerDate": { + "month": "1", + "date": "28" + }, "status_index": "0", "goodFortunes": { "l_1_event": "整理資料", @@ -211,9 +163,10 @@ }, { "event": "植樹節", - "year": "2024", - "month": "3", - "date": "12", + "triggerDate": { + "month": "3", + "date": "12" + }, "status_index": "0", "goodFortunes": { "l_1_event": "植樹造林", @@ -230,9 +183,10 @@ }, { "event": "白色情人節", - "year": "2024", - "month": "3", - "date": "14", + "triggerDate": { + "month": "3", + "date": "14" + }, "status_index": "0", "goodFortunes": { "l_1_event": "送禮物", @@ -249,9 +203,10 @@ }, { "event": "世界森林日", - "year": "2024", - "month": "3", - "date": "21", + "triggerDate": { + "month": "3", + "date": "21" + }, "status_index": "0", "goodFortunes": { "l_1_event": "環境教育", @@ -268,9 +223,10 @@ }, { "event": "愚人節", - "year": "2024", - "month": "4", - "date": "1", + "triggerDate": { + "month": "4", + "date": "1" + }, "status_index": "3", "goodFortunes": { "l_1_event": "喜笑顏開", @@ -287,9 +243,10 @@ }, { "event": "兒童節", - "year": "2024", - "month": "4", - "date": "4", + "triggerDate": { + "month": "4", + "date": "4" + }, "status_index": "0", "goodFortunes": { "l_1_event": "喜笑顏開", @@ -306,9 +263,10 @@ }, { "event": "世界健康日", - "year": "2024", - "month": "4", - "date": "7", + "triggerDate": { + "month": "4", + "date": "7" + }, "status_index": "0", "goodFortunes": { "l_1_event": "健康飲食", @@ -325,9 +283,10 @@ }, { "event": "世界地球日", - "year": "2024", - "month": "4", - "date": "22", + "triggerDate": { + "month": "4", + "date": "22" + }, "status_index": "0", "goodFortunes": { "l_1_event": "環保行動", @@ -344,9 +303,10 @@ }, { "event": "世界閱讀日", - "year": "2024", - "month": "4", - "date": "23", + "triggerDate": { + "month": "4", + "date": "23" + }, "status_index": "0", "goodFortunes": { "l_1_event": "推廣閱讀", @@ -363,9 +323,10 @@ }, { "event": "世界智慧財產權日", - "year": "2024", - "month": "4", - "date": "26", + "triggerDate": { + "month": "4", + "date": "26" + }, "status_index": "0", "goodFortunes": { "l_1_event": "保護創意", @@ -382,9 +343,10 @@ }, { "event": "星際大戰日", - "year": "2024", - "month": "5", - "date": "04", + "triggerDate": { + "month": "5", + "date": "04" + }, "status_index": "0", "goodFortunes": { "l_1_event": "電影馬拉松", @@ -401,9 +363,10 @@ }, { "event": "世界微笑日", - "year": "2024", - "month": "5", - "date": "08", + "triggerDate": { + "month": "5", + "date": "08" + }, "status_index": "0", "goodFortunes": { "l_1_event": "微笑", @@ -420,9 +383,11 @@ }, { "event": "母親節", - "year": "2024", - "month": "5", - "date": "12", + "triggerDate": { + "month": "5", + "week": "2", + "weekday": "7" + }, "status_index": "0", "goodFortunes": { "l_1_event": "家庭聚餐", @@ -439,9 +404,10 @@ }, { "event": "世界環境日", - "year": "2024", - "month": "6", - "date": "05", + "triggerDate": { + "month": "6", + "date": "05" + }, "status_index": "0", "goodFortunes": { "l_1_event": "少用塑膠", @@ -458,9 +424,10 @@ }, { "event": "世界獻血者日", - "year": "2024", - "month": "6", - "date": "14", + "triggerDate": { + "month": "6", + "date": "14" + }, "status_index": "0", "goodFortunes": { "l_1_event": "捐血", @@ -477,9 +444,11 @@ }, { "event": "夏至", - "year": "2024", - "month": "6", - "date": "20", + "triggerDate": { + "year": "2024", + "month": "6", + "date": "20" + }, "status_index": "0", "goodFortunes": { "l_1_event": "觀賞日出和日落", @@ -496,9 +465,10 @@ }, { "event": "巧克力日", - "year": "2024", - "month": "7", - "date": "07", + "triggerDate": { + "month": "7", + "date": "07" + }, "status_index": "0", "goodFortunes": { "l_1_event": "送巧克力", @@ -515,9 +485,10 @@ }, { "event": "宅宅日", - "year": "2024", - "month": "7", - "date": "13", + "triggerDate": { + "month": "7", + "date": "13" + }, "status_index": "0", "goodFortunes": { "l_1_event": "觀影", @@ -534,9 +505,10 @@ }, { "event": "國際冷笑話日", - "year": "2024", - "month": "7", - "date": "24", + "triggerDate": { + "month": "7", + "date": "24" + }, "status_index": "0", "goodFortunes": { "l_1_event": "講冷笑話", @@ -553,9 +525,10 @@ }, { "event": "國際友誼日", - "year": "2024", - "month": "7", - "date": "30", + "triggerDate": { + "month": "7", + "date": "30" + }, "status_index": "0", "goodFortunes": { "l_1_event": "與朋友聯絡", @@ -572,9 +545,10 @@ }, { "event": "國際左撇子日", - "year": "2024", - "month": "8", - "date": "13", + "triggerDate": { + "month": "8", + "date": "13" + }, "status_index": "0", "goodFortunes": { "l_1_event": "挑戰新事物", @@ -591,9 +565,10 @@ }, { "event": "世界攝影日", - "year": "2024", - "month": "8", - "date": "19", + "triggerDate": { + "month": "8", + "date": "19" + }, "status_index": "0", "goodFortunes": { "l_1_event": "拍攝照片", @@ -610,9 +585,10 @@ }, { "event": "國際狗狗日", - "year": "2024", - "month": "8", - "date": "26", + "triggerDate": { + "month": "8", + "date": "26" + }, "status_index": "0", "goodFortunes": { "l_1_event": "陪伴狗狗", @@ -629,9 +605,10 @@ }, { "event": "國際慈善日", - "year": "2024", - "month": "9", - "date": "5", + "triggerDate": { + "month": "9", + "date": "5" + }, "status_index": "0", "goodFortunes": { "l_1_event": "捐贈物資", @@ -648,9 +625,11 @@ }, { "event": "中秋節", - "year": "2024", - "month": "9", - "date": "17", + "triggerDate": { + "year": "2024", + "month": "9", + "date": "17" + }, "status_index": "0", "goodFortunes": { "l_1_event": "賞月", @@ -667,9 +646,10 @@ }, { "event": "國際和平日", - "year": "2024", - "month": "9", - "date": "21", + "triggerDate": { + "month": "9", + "date": "21" + }, "status_index": "0", "goodFortunes": { "l_1_event": "分享愛心", @@ -686,9 +666,10 @@ }, { "event": "教師節", - "year": "2024", - "month": "9", - "date": "28", + "triggerDate": { + "month": "9", + "date": "28" + }, "status_index": "0", "goodFortunes": { "l_1_event": "感謝老師", @@ -705,9 +686,10 @@ }, { "event": "世界糧食日", - "year": "2024", - "month": "10", - "date": "16", + "triggerDate": { + "month": "10", + "date": "16" + }, "status_index": "0", "goodFortunes": { "l_1_event": "節約糧食", @@ -724,9 +706,10 @@ }, { "event": "聯合國日", - "year": "2024", - "month": "10", - "date": "24", + "triggerDate": { + "month": "10", + "date": "24" + }, "status_index": "0", "goodFortunes": { "l_1_event": "支持和平", @@ -743,9 +726,10 @@ }, { "event": "萬聖節", - "year": "2024", - "month": "10", - "date": "31", + "triggerDate": { + "month": "10", + "date": "31" + }, "status_index": "4", "goodFortunes": { "l_1_event": "扮演角色", @@ -762,9 +746,10 @@ }, { "event": "世界善心日", - "year": "2024", - "month": "11", - "date": "13", + "triggerDate": { + "month": "11", + "date": "13" + }, "status_index": "0", "goodFortunes": { "l_1_event": "善待他人", @@ -778,25 +763,6 @@ "r_2_event": "", "r_2_desc": "" } - }, - { - "event": "感恩節", - "year": "2024", - "month": "11", - "date": "28", - "status_index": "0", - "goodFortunes": { - "l_1_event": "家人團聚", - "l_1_desc": "共享寶貴時光", - "l_2_event": "", - "l_2_desc": "" - }, - "badFortunes": { - "r_1_event": "", - "r_1_desc": "", - "r_2_event": "", - "r_2_desc": "" - } } ] } diff --git a/fortune_generator/json/static_special.json b/fortune_generator/json/static_special.json new file mode 100644 index 0000000..d079489 --- /dev/null +++ b/fortune_generator/json/static_special.json @@ -0,0 +1,46 @@ +{ + "special_events": [ + { + "event": "夏至", + "triggerDate": { + "year": "2025", + "month": "6", + "date": "21" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "觀賞日出和日落", + "l_1_desc": "享受一年最長的白天", + "l_2_event": "", + "l_2_desc": "" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + }, + { + "event": "中秋節", + "triggerDate": { + "year": "2025", + "month": "10", + "date": "6" + }, + "status_index": "0", + "goodFortunes": { + "l_1_event": "賞月", + "l_1_desc": "與家人一同賞月,增進感情", + "l_2_event": "吃月餅", + "l_2_desc": "與家人朋友分享月餅的美味" + }, + "badFortunes": { + "r_1_event": "", + "r_1_desc": "", + "r_2_event": "", + "r_2_desc": "" + } + } + ] +}