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.

    Show calendar based on IP Address accessed

    Scheduled Pinned Locked Moved Development
    68 Posts 3 Posters 21.5k Views 3 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.
    • M Offline
      MMRIZE @Spinster
      last edited by MMRIZE

      @Spinster said in Show calendar based on IP Address accessed:

      Modified the calendars to suite mine. I could see even if there is no calendar defined for a particular ip. Please advice

      in the calendar config, I added clientMap.

      {
      	module: "calendar",
      	header: "US Holidays",
      	position: "top_left",
      	config: {
      		clientMap: {
      			"192.168.178.63": [ "cal1", "cal2", "cal3" ],
      			"192.168.178.22": [ "cal3", "cal4", "cal5" ]
      		},
      		calendars: [
      			{
      				url: "...",
      				name: "cal1",
      			},
      
      ...
      
      S 3 Replies Last reply Reply Quote 0
      • S Offline
        sdetweil @Spinster
        last edited by

        @Spinster yes, the two pieces together

        ipaddress:“…”
        at each cal url block… only does one ipaddress per url

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        S 1 Reply Last reply Reply Quote 0
        • S Offline
          Spinster @MMRIZE
          last edited by

          @MMRIZE
          Here is my config

          	{
          		module: "alert",
          	},
          
          	/*
          	{
          		module: "updatenotification",
          		position: "top_bar"
          	},*/
          	{
          		module: "clock",
          		position: "top_left"
          	},
          	{
          		module: "MMM-ModuleMonkeyPatch",
          		config: {
          			patches: [
          				{
          					module: "calendar",
          					method: "socketNotificationReceived",
          					patch: async function (original, args) {
          						const [ notification, payload ] = args
          						if (notification === "CALENDAR_EVENTS") {
          							const calendarName = this.config.calendars.find((cal) => cal.url === payload?.url)?.name
          							const r = await fetch('http://10.5.11.1:8080/modules/getip')
          							const ip = JSON.parse(await r.text())?.[ 'address' ] ?? null
          							console.log(ip)
          							if (!this.config.clientMap?.[ ip ]?.includes(calendarName)) {
          								return original(notification, { ...payload, events: [] })
          							}
          						}
          						return original(notification, payload)
          					}
          				}
          			]
          		}
          	},
          	{
          		module: "getip",
          	},
          	{
          		module: "calendar",
          		header: "Home Cal",
          		position: "top_left",
          		config: {
          			clientMap: {
          				"10.5.11.5": [ "cal1" ],
          				"10.5.11.6": ["cal2"]
          			},
          			calendars: [
          				{
          					fetchInterval: 10 * 60 * 1000,
          					symbol: "calendar-check",
          					url: "https://homecals/xEzboFt7Kr3Yfiys?export",
          					name: "cal1",
          
          				}
          			]
          		}
          	}
          

          This is showing both 10.5.11.5 and 10.5.11.6 the same calendar. Though 10.5.11.6 should not have any calendar since it is not defined. Even I tried without an entry of 10.5.11.6 in calendar map but it still showing the calendar. What am I doing wrong. Please advice

          1 Reply Last reply Reply Quote 0
          • S Offline
            Spinster @MMRIZE
            last edited by

            @MMRIZE I even added the calendarmap, I hope you seen my config.js sent earlier

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              Spinster @Spinster
              last edited by

              @Spinster said in Show calendar based on IP Address accessed:

              @MMRIZE I even added the calendarmap, I hope you seen my config.js sent earlier

              Sorry, i think I have not installed Monkey module, will install and check again

              1 Reply Last reply Reply Quote 0
              • S Offline
                Spinster @sdetweil
                last edited by

                @sdetweil

                Should I use your earlier code and this? Please advise

                S 1 Reply Last reply Reply Quote 0
                • S Offline
                  sdetweil @Spinster
                  last edited by

                  @Spinster yes you need both

                  I am away from my system for another couple hours

                  will collapse to one post then

                  Sam

                  How to add modules

                  learning how to use browser developers window for css changes

                  S 1 Reply Last reply Reply Quote 0
                  • S Offline
                    sdetweil @sdetweil
                    last edited by sdetweil

                    @Spinster ok, here is the final

                    in calendar.js

                    add these variables

                    		updateOnFetch: true,
                    		useIPAddress: false     // add config var
                    	},
                    	timerHandle:null,                 // add this
                    	ourIPAddress:null,              // add this 
                    	requiresVersion: "2.1.0",
                    
                    

                    change this

                    	// Override start method.
                    	start () {
                    

                    to
                    this

                    	// Override start method.
                    	startup () {
                    

                    add this code

                    			let ip_match = false;
                    			if(this.config.useIPAddress){
                    			 const client_ip_for_this_calendar = this.getCalendarProperty(calendar.url, "ipaddress", null)
                    			 if(this.ourIPAddress)
                    			 	  ip_match = client_ip_for_this_calendar.includes(this.ourIPAddress)
                    			}
                    			if(this.config.useIPAddress == false || ip_match==true)
                    			  this.addCalendar(calendar.url, calendar.auth, calendarConfig);   // old original   line 
                    

                    and add this routine somewhere

                      notificationReceived(notification,payload){
                      	if(notification === 'ALL_MODULES_STARTED'){
                      		// if we are using ip address checking
                      		if(this.config.useIPAddress){
                      			// loop thru all the modules
                      			let m = MM.getModules().withClass("getip");
                      			if(m.length){
                      				// if getip is configured and not disabled
                      				if((m[0].disabled== undefined || (m[0].disabled != undefined && m[0].disabled == false)) ){
                      					// start a timer to wait for getip to finish
                      					this.timerHandle = setInterval(()=>{
                      						// get its dom content
                      						let client_ip = document.getElementById("getip_address")
                      						// if we found id
                      						if(client_ip !== null){
                      							// stop the timer
                      							clearInterval(this.timerHandle)
                      							// save our IP address, only need to look it up once
                      							this.ourIPAddress=client_ip.innerText
                      							// call startup
                      							this.startup()
                      						}
                      					}, 500)
                      				}
                      			}
                      			// thru the loop, didn't start a timer, module not found
                    			  if(this.timerHandle === null){
                    					// didn't find getip
                    					// module not found, can't do this later either
                    					this.config.useIPAddress = false;
                    					this.startup()
                    				}
                    			}
                      		// use default
                      		else
                      			this.startup()
                      	} 
                      	else if (notification === "FETCH_CALENDAR") {
                    			this.sendSocketNotification(notification, { url: payload.url, id: this.identifier+(this.ourIPAddress?'_'+this.ourIPAddress:'') });
                    		}
                      },
                    
                    

                    and in the socketNotificationReceived routine
                    change this

                    	socketNotificationReceived (notification, payload) {
                    		if (notification === "FETCH_CALENDAR") {
                    			this.sendSocketNotification(notification, { url: payload.url, id: this.identifier });
                    		}
                    
                    		if (this.identifier !== payload.id) {
                    			return;
                    		}
                    

                    to this

                    	socketNotificationReceived (notification, payload) {
                    
                    		if (this.identifier+(this.ourIPAddress?'_'+this.ourIPAddress:'') !== payload.id) {
                    			return;
                    		}
                    

                    and in the addCalendar routine
                    change this

                    		id: this.identifier,
                    

                    to this

                    		id: this.identifier+(this.ourIPAddress?'_'+this.ourIPAddress:''),
                    

                    to use

                    add the getip module to config.js, anywhere
                    add property to calendar above the calendars list (but still inside the config:{}{ section)

                    useIPAddress:true,
                    

                    in any cal url block you want to be sensitive to IP address add property

                        ipaddress:"xxx yyy zzz",  // space separated list of client ipaddresses this calendar can be displayed on
                    

                    andhow

                    Sam

                    How to add modules

                    learning how to use browser developers window for css changes

                    S 2 Replies Last reply Reply Quote 0
                    • S Offline
                      Spinster @MMRIZE
                      last edited by

                      @MMRIZE

                      After installing MonkeyPatch and adding the patch you have mentioned, I get the following error message when I run , npm run config:check
                      [2024-05-07 23:32:55.179] [INFO] Checking file… /home/vjkings/MagicMirror/config/config.js
                      [2024-05-07 23:32:55.222] [ERROR] Your configuration file contains syntax errors :(
                      [2024-05-07 23:32:55.223] [ERROR] Line 56 column 20: Parsing error: Unexpected token function

                      As per config.js, Line 56 is this

                      patch: async function (original, args) {

                      Whole section of patch as follows
                      patch: async function (original, args) {
                      const [ notification, payload ] = args
                      if (notification === “CALENDAR_EVENTS”) {
                      const calendarName = this.config.calendars.find((cal) => cal.url === payload?.url)?.name
                      const r = await fetch(‘http://192.168.1.4:8080/modules/getip’)
                      const ip = JSON.parse(await r.text())?.[ ‘address’ ] ?? null
                      if (!this.config.clientMap?.[ ip ]?.includes(calendarName)) {
                      return original(notification, { …payload, events: [] })
                      }
                      }
                      return original(notification, payload)
                      }

                      If I ignore the error and run the server, I don’t get any calendar and it just says Loading… in the mirror page
                      What is the reason for the error. Please advice

                      1 Reply Last reply Reply Quote 0
                      • S Offline
                        Spinster @sdetweil
                        last edited by

                        @sdetweil

                        Wow, Clear, will try it and provide feedback please.

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 3
                        • 4
                        • 5
                        • 6
                        • 7
                        • 4 / 7
                        • 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