// Example#8 imports.gi.versions.Gtk = "4.0"; const { Gtk } = imports.gi; const Main = imports.ui.main; const St = imports.gi.St; const ByteArray = imports.byteArray; const GLib = imports.gi.GLib; const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; const Soup = imports.gi.Soup; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; const Me = imports.misc.extensionUtils.getCurrentExtension(); const version = Gtk.get_major_version(); let myPopup; let started = false; let key = get_config('key'); const MyPopup = GObject.registerClass( class MyPopup extends PanelMenu.Button { _init () { super._init(0); let icon = new St.Icon({ //icon_name : 'security-low-symbolic', gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/logo.png' ), style_class : 'system-status-icon', }); this.add_child(icon); let workedItem = new PopupMenu.PopupMenuItem(''); let workedLabel = new St.Label({text:'TEMPS DE TRAVAIL : 0:00'}); workedItem.add(workedLabel); this.menu.addMenuItem(workedItem); let timeItem = new PopupMenu.PopupMenuItem(''); let timeLabel = new St.Label({text:'CAPITAL TOTAL : +0:00'}); timeItem.add(timeLabel); this.menu.addMenuItem(timeItem); let ifValidateItem = new PopupMenu.PopupMenuItem(''); let ifValidateLabel = new St.Label({text:'CAPITAL SI VALIDÉ : +0:00'}); ifValidateItem.add(ifValidateLabel); this.menu.addMenuItem(ifValidateItem); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let startItem = new PopupMenu.PopupMenuItem(''); let label = new St.Label({ text:'DÉBUT POINTAGE', style_class:'timer-btn' }); startItem.add(label); this.menu.addMenuItem(startItem); this.menu.connect('open-state-changed', (menu, open) => { if (open) { try { let result = send_request('https://badge.cadoles.com/ninebadge/rest/showtimers', 'POST', key) timeLabel.set_text('CAPITAL TOTAL : ' + result.capitaltime) let status = send_request('https://badge.cadoles.com/ninebadge/rest/status', 'POST', key) if(status.status == "started") { label.set_text('FIN POINTAGE'); started = true } else { started = false label.set_text('DÉBUT POINTAGE'); } let today = new Date(); let timers = result.timers; let lastTimer = new Date(timers[timers.length - 1].start); let currentHours = parseInt(Math.abs(today - lastTimer) / (1000 * 60 * 60) % 24); let currentMinutes = parseInt(Math.abs(today.getTime() - lastTimer.getTime()) / (1000 * 60) % 60); let timeday = status.timeday; let timedayToMinutes = timeday.split(':'); timedayToMinutes = parseInt(timedayToMinutes[0]) * 60 + parseInt(timedayToMinutes[1]); let workedToday = timedayToMinutes + currentHours * 60 + currentMinutes; let workedHours = Math.floor(workedToday / 60); let workedMinutes = workedToday % 60; let positiveCapital = result.capitaltime.includes('+'); let capitalToMinutes = result.capitaltime.replace('-', '').replace('+', '').split(':'); capitalToMinutes = parseInt(capitalToMinutes[0]) * 60 + parseInt(capitalToMinutes[1]); if(positiveCapital) { var workedTodayPlusCapital = workedToday + capitalToMinutes } else { var workedTodayPlusCapital = workedToday - capitalToMinutes } let diff = 7*60 - workedTodayPlusCapital let diffHours = Math.floor(diff / 60); let diffMinutes = diff % 60; workedLabel.set_text('TEMPS DE TRAVAIL : '+ workedHours + ':' + String(workedMinutes).padStart(2, 0)); if(diff > 0) { ifValidateLabel.set_text('CAPITAL SI VALIDÉ : -' + diffHours + ':' + String(diffMinutes).padStart(2, 0)); } else { ifValidateLabel.set_text('CAPITAL SI VALIDÉ : +' + diffHours + ':' + String(diffMinutes).padStart(2, 0)); } } catch(error) { log(error); } } }); startItem.connect('activate', () => { try { if(started){ send_request('https://badge.cadoles.com/ninebadge/rest/clockout', 'POST', key) started = false label.set_text('DÉBUT POINTAGE'); } else { send_request('https://badge.cadoles.com/ninebadge/rest/clockin', 'POST', key) label.set_text('FIN POINTAGE'); started = true } } catch(error) { log(error); } }); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let validateItem = new PopupMenu.PopupMenuItem(''); let validateLabel = new St.Label({ text:'VALIDER MA JOURNÉE', style_class:'validate-btn' }); validateItem.add(validateLabel); this.menu.addMenuItem(validateItem); validateItem.connect('activate', () => { try { send_request('https://badge.cadoles.com/ninebadge/rest/clockout', 'POST', key) started = false label.set_text('DÉBUT POINTAGE'); send_request('https://badge.cadoles.com/ninebadge/rest/validate', 'POST', key) } catch(error) { log(error); } }); // you can close, open and toggle the menu with // this.menu.close(); // this.menu.open(); // this.menu.toggle(); } }); function send_request(url, type='POST', key) { let [ok, out, err, exit] = GLib.spawn_command_line_sync(`/usr/bin/curl --insecure --max-time 2 -X ${type} -d '{"key": "${key}"}' -H "Content-Type: application/json" ${url} -o /tmp/test.json`); let text = GLib.file_get_contents('/tmp/test.json')[1]; let json_result = JSON.parse(text); return json_result } function get_config(property) { let text = GLib.file_get_contents(Me.dir.get_path() + '/config.json')[1]; let json_result = JSON.parse(text); return json_result[property]; } function addMinutes(date, minutes) { return new Date(date.getTime() + minutes*60000); } function init() { } function enable() { myPopup = new MyPopup(); Main.panel.addToStatusArea('myPopup', myPopup, 1); } function disable() { myPopup.destroy(); }