diff --git a/fortune_generator/fortune.js b/fortune_generator/fortune.js index 9b0adfb..a41ef84 100644 --- a/fortune_generator/fortune.js +++ b/fortune_generator/fortune.js @@ -26,6 +26,7 @@ fetch("https://api.ipify.org?format=json").then(response => { let goodFortunes = []; let badFortunes = []; let special_events = []; +var fortune_generated = false; // using async and await to prevent fetching the data too late... async function fetch_data(){ @@ -108,7 +109,7 @@ async function init_page(){ $('#month').html(showMonth); $('#date').html(showDate); $('#weekday').html(showDay); - + let eventIndex_1 = -1, eventIndex_2 = -1; // check if there is special event today for(let i = 0; i < special_events.length; i++){ @@ -124,7 +125,7 @@ async function init_page(){ // if there is upcoming event then show if(eventIndex_1 != -1){ let days = daysDiff(eventIndex_1); - let upcoming_event_1 = `距離${special_events[eventIndex_1].event}還剩${days}`; + let upcoming_event_1 = `距離${special_events[eventIndex_1].event}還剩${days}`; $('#upcoming-event-1').html(upcoming_event_1); } if(eventIndex_2 != -1){ @@ -138,6 +139,16 @@ async function init_page(){ let special_event_today = `今日是${special_events[special_events_index].event}`; $('#special-day').html(special_event_today); } + + let last_date_str = localStorage.getItem('last_date'); + if (last_date_str !== null && last_date_str !== undefined) { + let now_date = new Date(); + let last_date = new Date(last_date_str); + if (now_date.getFullYear() === last_date.getFullYear() && now_date.getMonth() === last_date.getMonth() && now_date.getDate() === last_date.getDate()) { + fortune_generated = true; + Appear(); + } + } } // event bar @@ -154,23 +165,41 @@ function Appear() { $('#init-page').hide(); $('#result-page').show(); - // transform ip to four numbers - let num = ip.split(".").map(num => parseInt(num)); - + // some lengths const goodLen = goodFortunes.length; const badLen = badFortunes.length; const statusLen = fortuneStatus.length; - // TODO: improve the hash process - let hashDate = Math.round(Math.log10(year * ((month << (Math.log10(num[3]) + day - 1)) * (date << Math.log10(num[2] << day))))); - let seed1 = (num[0] >> hashDate) * (num[1] >> Math.min(hashDate, 2)) + (num[2] << 1) * (num[3] >> 3) + (date << 3) * (month << hashDate) + (year * day) >> 2; - let seed2 = (num[0] << (hashDate + 2)) * (num[1] << hashDate) + (num[2] << 1) * (num[3] << 3) + (date << (hashDate - 1)) * (month << 4) + year >> hashDate + (date * day) >> 1; - - // decide the status - let status_index = ((seed1 + seed2) % statusLen + statusLen) % statusLen; + let status_index = -1; + let seed1 = -1; + let seed2 = -1; + + if (fortune_generated == false) { + // transform ip to four numbers + let num = ip.split(".").map(num => parseInt(num)); + + // TODO: improve the hash process + let hashDate = Math.round(Math.log10(year * ((month << (Math.log10(num[3]) + day - 1)) * (date << Math.log10(num[2] << day))))); + seed1 = (num[0] >> hashDate) * (num[1] >> Math.min(hashDate, 2)) + (num[2] << 1) * (num[3] >> 3) + (date << 3) * (month << hashDate) + (year * day) >> 2; + seed2 = (num[0] << (hashDate + 2)) * (num[1] << hashDate) + (num[2] << 1) * (num[3] << 3) + (date << (hashDate - 1)) * (month << 4) + year >> hashDate + (date * day) >> 1; + + // decide the status + status_index = ((seed1 + seed2) % statusLen + statusLen) % statusLen; + + // update last record + localStorage.setItem('last_date', d.toISOString()); + localStorage.setItem('last_status_index', status_index.toString()); + localStorage.setItem('last_seed1', seed1.toString()); + localStorage.setItem('last_seed2', seed2.toString()); + } else { + status_index = parseInt(localStorage.getItem('last_status_index')); + seed1 = parseInt(localStorage.getItem('last_seed1')); + seed2 = parseInt(localStorage.getItem('last_seed2')); + } + let status = `§ ${fortuneStatus[status_index]} §`; - + if(special){ status_index = special_events[special_events_index].status_index; let special_status = `§ ${fortuneStatus[status_index]} §`; @@ -187,35 +216,35 @@ function Appear() { let l2 = (((seed1 << 1) + date) % goodLen + goodLen) % goodLen; while(set.has(goodFortunes[l2].event)){ l2 = (l2 + 1) % goodLen; - } + } set.add(goodFortunes[l2].event); let r1 = (((seed1 >> 1) + (d.getMonth() << 3)) % badLen + badLen) % badLen; while(set.has(badFortunes[r1].event)){ r1 = (r1 + 2) % badLen; - } + } set.add(badFortunes[r1].event); let r2 = ((((((seed1 << 3) + (d.getFullYear() >> 5) * (date << 2)) % badLen) * seed2) >> 6) % badLen + badLen) % badLen; while(set.has(badFortunes[r2].event)){ r2 = (r2 + 1) % badLen; - } - - // organize the stuffs below this line... + } + + // organize the stuffs below this line... let l_1_event = good_span(goodFortunes[l1].event); - let l_1_desc = desc_span(goodFortunes[l1].description); + let l_1_desc = desc_span(goodFortunes[l1].description); let l_2_event = good_span(goodFortunes[l2].event); let l_2_desc = desc_span(goodFortunes[l2].description); let r_1_event = bad_span(badFortunes[r1].event); let r_1_desc = desc_span(badFortunes[r1].description); let r_2_event = bad_span(badFortunes[r2].event); let r_2_desc = desc_span(badFortunes[r2].description); - + if(special){ // instead clear variable name, use short variable name for here... cuz it's too repetitive let Data = special_events[special_events_index]; if(status_index == 0){ J_r_1_event.html(allGood); } - else{ + else{ J_r_1_event.html(bad_span(Data.badFortunes.r_1_event)); J_r_1_desc.html(desc_span(Data.badFortunes.r_1_desc)); J_r_2_event.html(bad_span(Data.badFortunes.r_2_event)); @@ -273,4 +302,4 @@ function getLuck() { Update(); } -init_page(); \ No newline at end of file +init_page();