'; if($i===1){ $ret = $m[0]; break; } } return$ret; } function get_short_kind_name($kind_name){ $kind_name_upper = strtoupper($kind_name); if(strpos($kind_name,'JT0820')!==false){ return '新竹新手四期'; }elseif(strpos($kind_name,'JT0821')!==false){ return '新竹專案四期'; } # $area = $xlass = $nth = ''; if(strpos($kind_name,'第')!==false and strpos($kind_name,'期')!==false){ $nth=$kind_name; $nth=explode('第',$nth)[1]; $nth=explode('期',$nth)[0]; $nth.='期'; } if(strpos($kind_name,'醫')!==false){ $xlass = '醫療'; }elseif(strpos($kind_name,'售')!==false){ $xlass = '零售'; }elseif(strpos($kind_name,'經')!==false){ $xlass = '經理'; }elseif(strpos($kind_name,'技')!==false){ $xlass = '技術'; }elseif(strpos($kind_name,'製')!==false){ $xlass = '製造'; }elseif(strpos($kind_name_upper,'EDGE')!==false){ $xlass = 'EdgeAI'; } if(strpos($kind_name,'北')!==false){ $area = $xlass=='醫療' ? '北部' : '台北'; }elseif(strpos($kind_name,'竹')!==false){ $area='新竹'; }elseif(strpos($kind_name,'中')!==false){ $area= $xlass=='醫療' ? '中部' : '台中'; }elseif(strpos($kind_name,'南')!==false){ $area='南部'; } $elective = array(); if(preg_match("/\w{5}([1234])$/", $kind_name, $elective)) { if($elective[1] == '1') { $nth .= "(一)"; } else if($elective[1] == '2') { $nth .= "(二)"; } else if($elective[1] == '3') { $nth .= "(三)"; } else if($elective[1] == '4') { $nth .= "(四)"; } } return $area && $xlass ? $area.$xlass.$nth : $kind_name; } define('TAIPEI_AREA_CODE', 'a'); define('HSINCHU_AREA_CODE', 'j'); define('TAICHUNG_AREA_CODE', 'b'); define('SOUTH_AREA_CODE', 'e'); #tester student: at071999 bt071999 am071990 at072999 $ARY_VIDEO_CATEGORY_SLUG = array(); $ARY_VIDEO_CATEGORY_SLUG[TAIPEI_AREA_CODE] = 'taipei'; $ARY_VIDEO_CATEGORY_SLUG[HSINCHU_AREA_CODE]='hsinchu'; $ARY_VIDEO_CATEGORY_SLUG[TAICHUNG_AREA_CODE]='taichung'; $ARY_VIDEO_CATEGORY_SLUG[SOUTH_AREA_CODE]='south'; function get_tech_video_category_slug($area_code, $join_no=''){ # to also know `get_category_by_slug` global$ARY_VIDEO_CATEGORY_SLUG; #echo$area_code.'#'; #print_r(array_keys($ARY_VIDEO_CATEGORY_SLUG)); if(!in_array($area_code, array_keys($ARY_VIDEO_CATEGORY_SLUG))){return '';} if(!$join_no){ return 'tech-'.$ARY_VIDEO_CATEGORY_SLUG[$area_code].'-video'; } $area = ($area_code==TAIPEI_AREA_CODE ? '' : $ARY_VIDEO_CATEGORY_SLUG[$area_code]); return 'tech'.($area ? '-'.$area : '') .'-video' .'-'.$join_no; } $ARY_STUDENT_AREA_CODE = array(); # People ID https://imgur.com/a/IJXBMkF $ARY_STUDENT_AREA_CODE[TAIPEI_AREA_CODE] = '台北'; $ARY_STUDENT_AREA_CODE[HSINCHU_AREA_CODE] = '新竹'; $ARY_STUDENT_AREA_CODE[TAICHUNG_AREA_CODE] = '台中'; $ARY_STUDENT_AREA_CODE[SOUTH_AREA_CODE] = '南部'; #define('SCHOOL_PRINCIPAL_MGR_ACCOUNT', 'htkung'); define('SCHOOL_PRINCIPAL_TECH_ACCOUNT', 'htkungZZZZZZZZZZZ_does_not_exist'); function is_staff_can_view_video($wp_user_login=null){ #video.aiacademy.tw only if(!$wp_user_login){ $user = wp_get_current_user(); if($user){$wp_user_login = $user->user_login;} } return !!$wp_user_login; # && !in_array($wp_user_login, $ary_parttime); # 20190903 by DH ask & Jock's decision: every staff can view all video $ary_parttime = array('eric8607242','andy6804tw'); $ary_ta = array( 'jock', 'nelson', 'jimmy', 'cyli', 'chi', 'vincent', 'leo', 'chris', 'dh', 'evanstsai', 'yuchi', 'tclin', 'tan', 'wkwang', 'wayne', 'yidar', 'wayne','phoenix_suns','hc'); $ary_staff_can_view_video = array_merge(array('rona', 'swc', 'vansindata','tclin','ellie'), $ary_ta); return in_array($wp_user_login, $ary_staff_can_view_video); } #taipei function is_tp_tech_leader_student($school_no){ return substr(strtolower($school_no),0,2)==TAIPEI_AREA_CODE.'t'; } function is_tp_mgr_student($school_no){ return substr(strtolower($school_no),0,2)==TAIPEI_AREA_CODE.'m'; } #hsinchu function is_hc_tech_leader_student($school_no){ return substr(strtolower($school_no),0,2)==HSINCHU_AREA_CODE.'t'; } function is_hc_mgr_student($school_no){ return substr(strtolower($school_no),0,2)==HSINCHU_AREA_CODE.'m'; } #taichung function is_tc_tech_leader_student($school_no){ return substr(strtolower($school_no),0,2)==TAICHUNG_AREA_CODE.'t'; } function is_tc_mgr_student($school_no){ return substr(strtolower($school_no),0,2)==TAICHUNG_AREA_CODE.'m'; } #----------END of is_XX_YYY_studnet functions. if($_SERVER['SERVER_NAME']!=='video.aiacademy.tw'){ $ARY_PARTNER_KEYCLOAK = array(); }else{ $ARY_PARTNER_KEYCLOAK = array( 'fpccomtw'=>array('area'=>TAIPEI_AREA_CODE, 'joinno'=>1), 'maryyang'=>array('area'=>TAIPEI_AREA_CODE, 'joinno'=>1), ); } $ary_AIA_school_no_joinno = array( 'bt081'=>2, 'jt081'=>3, 'jt082'=>4, 'at081'=>4, 'at082'=>5, 'at083'=>6, 'bt082'=>3, 'bt091'=>5, ); function is_has_video_xlass($school_no){ # Logic for after 2020 $school_no = strtolower($school_no); $is_staff = substr($school_no, strlen($school_no) - strlen('@aiacademy.tw'))==='@aiacademy.tw' || substr($school_no, strlen($school_no) - strlen('@sted.tw'))==='@sted.tw'; if($is_staff){ return true; } $b=false; if($school_no){ $ARY_HAS_VIDEO_XLASS = array( 'AT071','AT072','AT073','AT081','AT082','AT083', 'JT071','JT072','JT081', 'BT071','BT081','BT082','BT091', 'ET082','ET083', ); foreach($ARY_HAS_VIDEO_XLASS as$v){ $v = strtolower($v); if(strpos($school_no,$v)===0){ $b=true;break; } } } return$b; } function is_no_video_xlass($school_no){ # Logic for before 2019 $b=false; $school_no = strtolower($school_no); if($school_no){ $ARY_NO_VIDEO_XLASS = array('bt083','jt082'); foreach($ARY_NO_VIDEO_XLASS as$v){ $v = strtolower($v); if(strpos($school_no,$v)===0){ $b=true;break; } } } return$b; } function get_student_join_no($school_no){ global$ARY_PARTNER_KEYCLOAK, $ary_AIA_school_no_joinno; $school_no = strtolower($school_no); if(isset($ARY_PARTNER_KEYCLOAK[$school_no])){ return $ARY_PARTNER_KEYCLOAK[$school_no]['joinno']; } $class_no = substr($school_no, 0, 5); if(isset($ary_AIA_school_no_joinno[$class_no])){ return $ary_AIA_school_no_joinno[$class_no]; } return substr($school_no, 4, 1)+0; #limit_at_join_no } function get_student_area_code($school_no){ global$ARY_PARTNER_KEYCLOAK; $school_no = strtolower($school_no); if(isset($ARY_PARTNER_KEYCLOAK[$school_no])){ return $ARY_PARTNER_KEYCLOAK[$school_no]['area']; } return substr($school_no,0,1); } function is_taipei_student_area_code($area_code){ return strtolower($area_code)===TAIPEI_AREA_CODE; } function is_taichung_student_area_code($area_code){ return strtolower($area_code)===TAICHUNG_AREA_CODE; } function is_hsinchu_student_area_code($area_code){ return strtolower($area_code)===HSINCHU_AREA_CODE; } function is_south_student_area_code($area_code){ return strtolower($area_code)===SOUTH_AREA_CODE; } function get_aia_calendar_url($school_no){ #$school_no_prefix = substr($school_no, 0, strlen($school_no)-3); #return AIA_CALENDAR_URL_PREFIX.$school_no_prefix .'/'; return get_calendar_url($school_no); } function get_logined_success_redirect_url($school_no){ $school_no_prefix = substr($school_no, 0, strlen($school_no)-3); $IS_CLASS = strpos($_SERVER['SERVER_NAME'],'class.')!==false; if($IS_CLASS){ return get_aia_calendar_url($school_no); } $IS_VIDEO = strpos($_SERVER['SERVER_NAME'],'video.')!==false; if($IS_VIDEO){ /* $school_no_year = substr($school_no, 2,2); $taiwan_year = 100 + $school_no_year; $global_year = $taiwan_year + 1911; $year_in_url = ''; if($global_year>2018){ }*/ /* mgr-taichung-video-1 mgr-video-1 mgr-video-2 mgr-hsinchu-video-1 */ $join_no = get_student_join_no($school_no); $code_in_url = ''; $area_code=get_student_area_code($school_no); if(is_taichung_student_area_code($area_code)){ $code_in_url = 'taichung-'; }elseif(is_hsinchu_student_area_code($area_code)){ $code_in_url = 'hsinchu-'; }elseif(is_south_student_area_code($area_code)){ $code_in_url = 'south-'; } return CATEGORY_PREFIX_URL . 'mgr-'.$code_in_url.'video-'.$join_no.'/'; } } function is_student_keycloak_user($keycloak_groups){ foreach($keycloak_groups as $group) { if (preg_match(SCHOOL_NO_PATTERN, strtolower($group)) === 1) { return true; } } return false; } function is_mgr_student_school_no($school_no){ $school_no = strtolower($school_no); return 1===preg_match(MGR_STUDENT_KEYCLOAK_USERNAME_PATTERN, $school_no); } function get_calendar_url($school_no){ $school_no = strtolower($school_no); return AIA_CALENDAR_URL_PREFIX.$school_no; } function get_school_no_from_keycloak_groups($key_cloak_groups) { $ary_school_no = array(); foreach($key_cloak_groups as $group) { if (preg_match(SCHOOL_NO_PATTERN, strtolower($group)) === 0) { continue; } $ary_school_no[] = $group; } return $ary_school_no; } function get_school_no_weight($school_no) { $elective = (int) substr($school_no, 5, 1); if ($elective == 0) { $elective = 10; } return ((int) substr($school_no, 2, 2) * 100) + ((int) substr($school_no, 4, 1) * 10) + $elective; } function school_weight_cmp($a, $b) { $a_weight = get_school_no_weight($a); $b_weight = get_school_no_weight($b); if ($a_weight == $b_weight) { return 0; } return ($a_weight < $b_weight) ? 1 : -1; } function get_recent_school_no($ary_school_no) { $max_year = max(array_map(function ($p) { return (int) substr($p, 2, 2); }, $ary_school_no)); $ary_school_no_with_max_year = array_filter($ary_school_no, function($p) use ($max_year) { return ((int) substr($p, 2, 2)) == $max_year; }); $ary_period = array_map(function ($p) { return (int) substr($p, 4, 1); }, $ary_school_no_with_max_year); # [NOTE] sort by elective number only after year_period 092 that has elective course if ($max_year * 10 + max($ary_period) >= 92) { usort($ary_school_no_with_max_year, 'school_weight_cmp'); $ary_period = array_map(function ($p) { return (int) substr($p, 4, 1); }, $ary_school_no_with_max_year); } return $ary_school_no_with_max_year[array_search(max($ary_period), $ary_period)]; } function get_recent_school_no_from_keycloak_groups($key_cloak_groups) { return get_recent_school_no(get_school_no_from_keycloak_groups($key_cloak_groups)); } function is_student_had_the_class($key_cloak_groups, $target_school_no) { $school_no = get_school_no_from_keycloak_groups($key_cloak_groups); foreach($school_no as $p) { if (strpos(strtolower($p), $target_school_no) === 0) { return true; } } return false; } function can_view_aia_video_keycloak_user($keycloak_username){ if(strpos($keycloak_username, '@aiacademy.tw')!==false ||strpos($keycloak_username, '@sted.tw')!==false ){return true;} } function can_view_aia_calendar_keycloak_user($keycloak_username){ if(strpos($keycloak_username, '@aiacademy.tw')!==false ||strpos($keycloak_username, '@sted.tw')!==false ){return true;} $a = array( 'swc','vansindata1', 'richie.tsai@aiacademy.tw', 'tclin@aiacademy.tw', 'wayne@aiacademy.tw', 'cyli@aiacademy.tw'); return in_array($keycloak_username, $a); } // START integrating VueJS frontend & keycloak & laravel function encode_keycloak_token_obj_for_db($token_obj){ $token_serialize = serialize($token_obj); return str_replace('\\','```',$token_serialize); } function decode_keycloak_token_obj_for_db($token_serialized_from_db){ $s = str_replace('```','\\',$token_serialized_from_db); # https://stackoverflow.com/questions/10152904/how-to-repair-a-serialized-string-which-has-been-corrupted-by-an-incorrect-byte $s2 = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) { return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";'; }, $s); $token_obj = unserialize($s2); return $token_obj; } function hash_keycloak_token_string($token_value){ return hash('sha256', $token_value); } function encode_frontend_keycloak_token_value($token_value){ return base64_encode($token_value); } function decode_frontend_keycloak_token_value($token_value){ return base64_decode($token_value); } // END integrating VueJS frontend & keycloak & laravel