• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

MMM-Todoist - Your todoist tasks on your mirror

Scheduled Pinned Locked Moved Productivity
76 Posts 37 Posters 93.0k Views 39 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    tidus5
    last edited by yawns Aug 15, 2018, 1:28 PM Aug 22, 2017, 4:56 PM

    This is my code
    it’s based on 2 users (i badly commented the code)

    /* Magic Mirror
     * Fetcher
     *
     *
     * By Michael Teeuw http://michaelteeuw.nl edited for Wunderlist by Paul-Vincent Roll
     * Edited again for Todoist by Chris Brooker
     * 
     * MIT Licensed.
     */
    
    var request = require("request");
    
    /* Fetcher
     * Responsible for requesting an update on the set interval and broadcasting the data.
     *
     * attribute listID string - ID of the Wunderlist list.
     * attribute reloadInterval number - Reload interval in milliseconds.
     */
     
     	function dateDiff(date1, date2){
        var diff = {}                           // Initialisation du retour
        var tmp = date2 - date1;
     
        tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
        diff.sec = tmp % 60;                    // Extraction du nombre de secondes
     
        tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
        diff.min = tmp % 60;                    // Extraction du nombre de minutes
     
        tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
        diff.hour = tmp % 24;                   // Extraction du nombre d'heures
         
        tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
        diff.day = tmp;
         
        return diff;
    }
    
    var Fetcher = function(listID, reloadInterval, accessToken, clientID) {
     var self = this;
     if (reloadInterval < 1000) {
    	reloadInterval = 1000;
     }
    
     var reloadTimer = null;
     var items = [];
    
     var fetchFailedCallback = function() {};
     var itemsReceivedCallback = function() {};
    
     /* private methods */
    
     /* fetchTodos()
    	* Request the new items.
    	*/
    
     var fetchTodos = function() {
    	clearTimeout(reloadTimer);
    	reloadTimer = null;
    
    	request({
    		url: "https://todoist.com/API/v7/sync/",
    		method: "POST",
    		headers: { 
    			'content-type': 'application/x-www-form-urlencoded',
    			'cache-control': 'no-cache' 
    		},
    		form: { 
    				token: accessToken,
    				sync_token: '*',
    				resource_types: '["items"]' 
    		}
    	 },
    	 
    	 
    	 function(error, response, body) {
    		if (!error && response.statusCode == 200) {
             items = [];
    		 for (var i = 0; i < JSON.parse(body).items.length; i++) {
    			 if (JSON.parse(body).items[i].project_id == listID) {
    		
    		donneetableau = JSON.parse(body).items[i];
    		onbalance = [];
    		icontodo = [];
    		assignedname = [];
    		datedueretour = [];
    		contentretour = [];
    		assignedtodoname = [];
    		checkedretour = [];
    		
    		
    		if (donneetableau.priority == '1') {icontodo ='<i></i> '}
    		else if (donneetableau.priority == '2') {icontodo ='<i></i> '}
    		else if (donneetableau.priority == '3') {icontodo ='<i></i> '}
    		else {icontodo ='<i></i> '}
    
    		if (donneetableau.assigned_by_uid == 'XXXXXXXX') {assignedname ='(XXXXX)'}//TEST  first XXX UID second XXXX yourname
    		else if (donneetableau.assigned_by_uid == 'XXXXXXX') {assignedname ='(XXXXXX)'}//TEST  first XXX UID second XXXX yourname
    		else {assignedname ='Inconnu'};
    		
    		if (donneetableau.due_date_utc) 
    			{
    				date1 = new Date();
    				date2 = new Date(donneetableau.due_date_utc);
    				diff = dateDiff(date1, date2);
    								
    				if (diff.day = '1') {datedueretour += diff.day + 'd <i></i> ';}
    				else if (diff.hour >= '1') {datedueretour += diff.hour + 'h <i></i> ';}		
    				else {datedueretour += diff.min + 'min <i></i> ';};						
    
    
    			}
    		else {datedueretour =''};
    		
    		contentretour = donneetableau.content;
    		
    		if (donneetableau.responsible_uid ) {
    		if (donneetableau.responsible_uid == 'XXXXXXX') {
    		assignedtodoname ='<i></i> '
    		} ////YOUR UID USER
    		
    		else if (donneetableau.responsible_uid == 'XXXXXXX') {assignedtodoname ='<i></i> '}
    		else {assignedtodoname ='Inconnu'};  // YOUR UID USER
    		} else { assignedtodoname ='' };
    		
    		checkedretour = donneetableau.checked;
    		onbalance +=assignedtodoname + icontodo + datedueretour + contentretour;
    		items.push(onbalance);	
    				//items.split('\n');
    				 //priority.push(JSON.parse(body).priority[i].priority);	
    				 //datedue.push(JSON.parse(body).datedue[i].due_date_utc);	
    
    			 }
    		 }
    		 self.broadcastItems();
    		 scheduleTimer();
    		}
    	 });
    
     };
    
     /* scheduleTimer()
    	* Schedule the timer for the next update.
    	*/
    
     var scheduleTimer = function() {
    	//console.log('Schedule update timer.');
    	clearTimeout(reloadTimer);
    	reloadTimer = setTimeout(function() {
    	 fetchTodos();
    	}, reloadInterval);
     };
    
     /* public methods */
    
     /* setReloadInterval()
    	* Update the reload interval, but only if we need to increase the speed.
    	*
    	* attribute interval number - Interval for the update in milliseconds.
    	*/
     this.setReloadInterval = function(interval) {
    	if (interval > 1000 && interval < reloadInterval) {
    	 reloadInterval = interval;
    	}
     };
    
     /* startFetch()
    	* Initiate fetchTodos();
    	*/
     this.startFetch = function() {
    	fetchTodos();
     };
    
     /* broadcastItems()
    	* Broadcast the exsisting items.
    	*/
     this.broadcastItems = function() {
    	if (items.length
    
    1 Reply Last reply Reply Quote 0
    • C Offline
      Cupola
      last edited by Cupola Oct 26, 2017, 2:34 PM Oct 26, 2017, 1:53 PM

      Dumb question, how do you exactly generate the access token? I’m a little bit confused…
      From pm2 logs, I read:
      ** Message: console message: http://localhost:8080/modules/MMM-Todoist//MMM-Todoist.js @199: SyntaxError: Unexpected token ‘>’
      I used the access token generated from here, but I’m not sure about the process, which App service URL did you use? Which OAuth redirect URL? And last which token is the right one? I can see three of them
      Thanks in advance

      pyrosmileyP 1 Reply Last reply Oct 27, 2017, 12:49 PM Reply Quote 1
      • pyrosmileyP Offline
        pyrosmiley @Cupola
        last edited by Oct 27, 2017, 12:49 PM

        @Cupola

        Not a dumb question, don’t worry! Oauth2 can be super confusing, and everyone does it a little differently which is… frustrating at best.

        The Access Token you need is the 3rd one, what they refer to as your Test Token on the page. (The idea behind this is that with OA2, each would-be client has to use its ID and Secret to ask for specific account access for each account it wants to see. They basically did that process for you once, for testing or personal things like this that only need your account.)

        You don’t need to worry about the OAuth redirect URL or the App Service URL. I have each filled with http://127.0.0.1 but I don’t think either are required at all.

        Hopefully this gets you up and running!

        1 Reply Last reply Reply Quote 0
        • C Offline
          Cupola
          last edited by Oct 27, 2017, 3:34 PM

          Thank you, now it’s working

          1 Reply Last reply Reply Quote 1
          • M Offline
            mariecbilodeau
            last edited by Aug 14, 2018, 12:43 AM

            Is there a way to add bullets before each task?

            1 Reply Last reply Reply Quote 0
            • A Offline
              amomat
              last edited by Aug 22, 2018, 5:31 PM

              Hi. Is it possible to show who the task is assigned to? Trying to set up a to-do list for the kids to show their chores.

              1 Reply Last reply Reply Quote 0
              • eprostkoE Offline
                eprostko
                last edited by Dec 21, 2019, 1:40 PM

                Todoist is working on my MM, but the day is not right. I have a daily recurring task that says “today” on my mirror, but is “tomorrow” when I look on todoist.com directly or on my phone app.

                Has anyone else seen and resolved this behavior?

                1 Reply Last reply Reply Quote 0
                • M Offline
                  Mariba
                  last edited by Dec 26, 2019, 11:32 AM

                  Hey,
                  is there functionality to see the number of days left for an event? I’d be happy if I could see that.
                  Or is it possible to show it myself by subtracting the date of the event from the current date? If yes, how do I do it?
                  Thanks. Happy New Year.

                  1 Reply Last reply Reply Quote 0
                  • J Offline
                    jani.karna
                    last edited by Jan 7, 2020, 9:03 AM

                    Hi! How can I get sorting working? No matter what I try, items are only added to the end of the list. I would like to sort them by priority and then by due date, but can’t figure of how.

                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      Jas
                      last edited by Jan 27, 2020, 12:33 AM

                      For the OAuth, I can’t seem to find the “Test Token” on ToDoList site. Under the app, I only have Client ID and Client Secret. Under Settings/Integrations, there is a entry for API Token. Which of the 3 should I be using? Right now, I don’t have anything showing up from ToDoList when Mirror is running.

                      Thanks

                      1 Reply Last reply Reply Quote 0
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      • 6
                      • 7
                      • 8
                      • 7 / 8
                      • First post
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy