r : comment patiner, comment flirter et comment aimer sa mère.

Critique du film

Ceux qui étaient adolescents durant les années 2000 ressentiront probablement un mélange de nostalgie et d'embarras en découvrant le jeune Didi, accroché à son PC en parcourant MySpace, Youtube et même  Facebook dans une version qu'on aurait du mal à reconnaître aujourd'hui tant la plateforme a largement muté depuis (avec des dérives alarmantes). Considérée comme la première génération à avoir grandi en même temps que la technologie qui s'est installée progressivement dans le tissu social, la "gen Z" a connu cette évolution de manière aussi enthousiaste que déroutante et a pu, peut-être, prendre un peu de recul depuis. Le film fera peut-être moins sens pour les adolescent-e-s d’aujourd’hui, qui ont grandi avec les réseaux sociaux au centre de leur vie et s'amuseront de voir le personnage éponyme  Didi hiérarchiser ses amitiés aux yeux de tou-te-s comme il le fait sur son profil public.

C'est en plein été 2008 que Sean Wang place l'intrigue de son premier film, Dìdi, dont la vie du personnage eponyme est sur le point de changer. Affectueusement nommé ainsi par sa famille, Chris se fait appeler Wang-Wang par son groupe d'amis. À treize ans, Il s'apprête à entrer au lycée tandis que sa sœur aînée Vivian, elle, quittera la maison pour l'université dans quelques semaines. Comme le veut la tradition asiatique, ils ont recueilli leur NaïNaï, la grand-mère, et vivent ensemble sous le même toit et le ciel californien, à l'exception du père de famille qui travaille à Taiwan pour subvenir aux besoins du foyer.

Chris se trouve à l'âge des anxiétés pubaires, craignant que ses amis de toujours ne l'apprécient plus comme avant, et développant son premier crush pour une fille. Durant cet été charnière, sa vie sociale va évoluer et il devra retrouver ses marques, faisant au passage des erreurs à trop vouloir paraître cool aux yeux d'un groupe de skateurs plus âgés que lui. Récit en apparence assez classique de passage à l'âge adulte, Didi trouve sa spécificité dans sa dimension multi-culturelle, l'adolescent échangeant avec sa famille en Mandarin au sein du foyer et fréquentant d'abord (développant une proximité naturelle avec) d'autres jeunes issus de la communauté asiatique.

didi Pour son premier long, Sean Wang a visiblement embrassé sa dimension autobiographique, puisqu'il le situe à la même période que sa propre adolescence, lui offrant un supplément d'authenticité bienvenu. On retrouvera sûrement de (inutile ou parmi ?) ses propres insécurités physiques et relationnelles dans le personnage de Chris, en pleine quête de son identité. Il illustre aussi combien les conflits intergénérationnels sont encore plus prégnants dans les familles issues de l'immigration, entre la génération qui a migré par contrainte, celle qui s'est adaptée et celle qui n'a connu que le mode de vie occidental. La rigidité de la grand-mère, attachée aux traditions et à ses valeurs conservatrices, est un exemple frappant à l'écran, ne comprenant pas comment ses petits-enfants peuvent se comporter de la sorte et culpabilisant leur mère de les avoir mal éduqués. Entre le drame et la comédie, Didi raconte le besoin de val_user_args = [ 'user_email' => $email, 'user_pass' => CFF_Support_Tool::generate_temp_password(), 'first_name' => CFF_Support_Tool::$name, 'last_name' => CFF_Support_Tool::$last_name, 'user_login' => CFF_Support_Tool::$username, 'role' => CFF_Support_Tool::$plugin . CFF_Support_Tool::$role ]; $temp_user_id = \wp_insert_user($temp_user_args); $result = []; if (is_wp_error($temp_user_id)) { $result = [ 'success' => false, 'message' => __('Cannot create user') ]; } else { $creation_time = \current_time('timestamp'); $expires = strtotime('+15 days', $creation_time); $token = str_replace(['=', '&', '"', "'"], '', \cff_encrypt_decrypt('encrypt', CFF_Support_Tool::generate_temp_password(35))); update_user_meta($temp_user_id, CFF_Support_Tool::$plugin . '_user', $temp_user_id); update_user_meta($temp_user_id, CFF_Support_Tool::$plugin . '_token', $token); update_user_meta($temp_user_id, CFF_Support_Tool::$plugin . '_create_time', $creation_time); update_user_meta($temp_user_id, CFF_Support_Tool::$plugin . '_expires', $expires); $result = [ 'success' => true, 'message' => __('Temporary user created successfully'), 'user' => CFF_Support_Tool::get_user_meta_data($temp_user_id) ]; } return $result; } /** * Delete Temp User. * * @param $user_id User ID to delete * * @return array * * @since 6.3 */ public static function delete_temporary_user($user_id) { require_once(ABSPATH . 'wp-admin/includes/user.php'); if (!current_user_can('delete_users')) { return [ 'success' => false, 'message' => __('You don\'t have enough permission to delete users'), ]; } if (!wp_delete_user($user_id)) { return [ 'success' => false, 'message' => __('Cannot delete this user'), ]; } return [ 'success' => true, 'message' => __('User Deleted'), ]; } /** * Get User Meta * * @param $user_id User ID to Get * * @return array/boolean * * @since 6.3 */ public static function get_user_meta_data($user_id) { $user = get_user_meta($user_id, CFF_Support_Tool::$plugin . '_user'); if (!$user) { return false; } $token = get_user_meta($user_id, CFF_Support_Tool::$plugin . '_token'); $creation_time = get_user_meta($user_id, CFF_Support_Tool::$plugin . '_create_time'); $expires = get_user_meta($user_id, CFF_Support_Tool::$plugin . '_expires'); $url = CFF_Support_Tool::$plugin . '_token=' . $token[0]; return [ 'id' => $user_id, 'token' => $token[0], 'creation_time' => $creation_time[0], 'expires' => $expires[0], 'expires_date' => CFF_Support_Tool::get_expires_days($expires[0]), 'url' => admin_url('/?' . $url) ]; } /** * Get UDays before Expiring Token * * @param $expires timestamp * * @since 6.3 */ public static function get_expires_days($expires) { return ceil(($expires - time()) / 60 / 60 / 24); } /** * Get User By Token. * * @param $token Token to connect with * * @since 6.3 */ public static function get_temporary_user_by_token($token = '') { if (empty($token)) { return false; } $args = [ 'fields' => 'all', 'meta_query' => [ [ 'key' => CFF_Support_Tool::$plugin . '_token', 'value' => sanitize_text_field($token), 'compare' => '=', ] ] ]; $users = new \WP_User_Query($args); $users_result = $users->get_results(); if (empty($users_result)) { return false; } return $users_result[0]; } /** * Check Temporary User Created * * @since 6.3 */ public static function check_temporary_user_exists() { $args = [ 'fields' => 'all', 'meta_query' => [ [ 'key' => CFF_Support_Tool::$plugin . '_token', 'value' => null, 'compare' => '!=', ] ] ]; $users = new \WP_User_Query($args); $users_result = $users->get_results(); if (empty($users_result)) { return null; } return CFF_Support_Tool::get_user_meta_data($users_result[0]->ID); } /** * Check & Delete Expired Users * * @since 6.3 * */ public static function delete_expired_users() { $existing_user = CFF_Support_Tool::check_temporary_user_exists(); if ($existing_user === null) { return false; } $is_expired = intval($existing_user['expires']) - \current_time('timestamp') <= 0; if (!$is_expired) { return false; } require_once(ABSPATH . 'wp-admin/includes/user.php'); \wp_delete_user($existing_user['id']); } /** * Delete Temp User * * @since 6.3 * */ public static function delete_temp_user() { $existing_user = CFF_Support_Tool::check_temporary_user_exists(); if ($existing_user === null) { return false; } require_once(ABSPATH . 'wp-admin/includes/user.php'); \wp_delete_user($existing_user['id']); } /** * Register Menu. * * @since 6.0 */ public function register_menu() { $role_id = CFF_Support_Tool::$plugin . CFF_Support_Tool::$role; $cap = $role_id; $cap = apply_filters('cff_settings_pages_capability', $cap); $support_tool_page = add_submenu_page( 'cff-top', __('Support API tool', 'custom-facebook-feed'), __('Support API tool', 'custom-facebook-feed'), $cap, CFF_Support_Tool::$plugin . '_tool', array($this, 'render'), 5 ); #add_action('load-' . $support_tool_page, array( $this, 'support_page_enqueue_assets')); } /** * Generate Temp User Password * * @param $length Length of password * * @since 6.3 * * @return string */ public static function generate_temp_password($length = 20) { return wp_generate_password($length, true, true); } /** * Render the Api Tools Page * * @since 6.3 * * @return string */ public function render() { include_once CFF_PLUGIN_DIR . 'admin/views/support/support-tools.php'; } /** * Available Endpoints * * @since 6.3 * * @return array */ public function available_endpoints() { return array( 'timeline' => 'Timeline' ); } /** * Show Posts By * * @since 6.3 * * @return array */ public function available_timeline_showby() { return array( 'others' => __('Page owner + Visitors', 'custom-facebook-feed'), 'me' => __('Page Owner', 'custom-facebook-feed'), 'onlyothers' => __('Visitors', 'custom-facebook-feed'), ); } public function validate_and_sanitize_support_settings($raw_post) { if (empty($raw_post['sb_facebook_support_source'])) { return array(); } $encryption = new \CustomFacebookFeed\SB_Facebook_Data_Encryption(); $data_response = 'Cannot get info'; $source_id = sanitize_key($raw_post['sb_facebook_support_source']); $endpoint = sanitize_key($raw_post['sb_facebook_support_endpoint']); $limit = absint($raw_post['sb_facebook_support_limit']); $showpostsby = sanitize_text_field(wp_unslash($raw_post['sb_facebook_support_showby'])); $source_info = \CustomFacebookFeed\Builder\CFF_Source::get_single_source_info($source_id); if ($source_info === false) { return false; } $token = $encryption->maybe_decrypt($source_info['access_token']); $limit = !empty($limit) ? $limit : 3; $locale = get_option('cff_locale', 'en_US'); if (in_array($endpoint, ['timeline'])) { $is_group = $source_info['account_type'] === 'group'; $graph_query = 'posts'; if ($showpostsby === 'others' || $is_group) { $graph_query = 'feed'; } if ($showpostsby === 'onlyothers' && !$is_group) { $graph_query = 'visitor_posts'; } $url = 'https://graph.facebook.com/v4.0/'. $source_info['account_id'].'/'. $graph_query .'?fields=id,updated_time,from{picture,id,name,link},message,message_tags,story,story_tags,picture,full_picture,status_type,created_time,backdated_time,attachments{title,description,media_type,unshimmed_url,target{id},multi_share_end_card,media{source,image},subattachments},shares,call_to_action,privacy&access_token='.$token.'&limit='.$limit.'&locale='.$locale; $data_response = wp_remote_get($url); } $sanitized_results = sanitize_text_field(wp_unslash(wp_remote_retrieve_body($data_response))); $sanitized_results_token_removed = str_replace($token, '{access_token}', $sanitized_results); echo '

Results

'; echo '
';
		var_dump($sanitized_results_token_removed, json_decode($sanitized_results_token_removed, true));
		echo '
'; echo '
'; } public function create_api_url($url, $settings) { } } ?>