#!/bin/bash

#----------------------------------#

TIMEOUT=600000 # 10min = 10 * 60 * 1000 # Веремя жизни сессии

NOTIFY_TIMEOUT=60000			# 1min = 1 * 60 * 1000 # Время отображения уведомления
NOTIFY_LEVEL="critical"			# low, normal, critical # Тип уведомления
NOTIFY_ICON="system-config-date"	# Иконка уведомления
NOTIFY_TILE="WARNING"			# Заголовок уведомления
NOTIFY_WARNING_MESSAGE="Logged out in 60s. To prevent this, move the mouse!"	# Сообщение за TIMEOUT до завершениия сессии
NOTIFY_KILL_MESSAGE="Session ended!"	# Сообщение после завершения сесси

#----------------------------------#

notify_send_all () {

  for NT_USER in $USER_LIST
    do
        NT_USERNAME=${NT_USER%@*}
        NT_USER_DISPLAY=${NT_USER#*@}
        sudo -u $NT_USERNAME DISPLAY=${NT_USER_DISPLAY:1:-1} \
                             notify-send "$@"
    done
}

#----------------------------------#

USER_LIST=$(who | grep -E "\(:[0-9](\.[0-9])*\)" | awk '{print $1 "@" $NF}' | sort -u)
XSESSION_COUNT=$(w | grep -c xdm)

for USER in $USER_LIST
    do
        USERNAME=${USER%@*}
        USER_DISPLAY=${USER#*@}
        PID_X=$(lsof -w -F '' /tmp/.X11-unix/X${USER_DISPLAY:2:-1} | cut -c 2- | tr -d ' ')
        PID_XDM=$(ps -o ppid -p $PID_X | tail -n1 | tr -d ' ')
        XDM=$(ps -p $PID_XDM | tail -n1 | awk '{print $4}' | tr -d ' ')

        if [ $XDM == gdm ]; then
            GDM_XAUTH=$(ls -1 /run/gdm/auth-for-gdm-*/database)
            IDLE=$(XAUTHORITY=$GDM_XAUTH DISPLAY=${USER_DISPLAY:1:-1} xprintidle)
        else
            IDLE=$(DISPLAY=$(hostname)${USER_DISPLAY:1:-1} su - $USERNAME -c xprintidle)
        fi

        if [ $XSESSION_COUNT -gt 0 ]; then
            let TIMEOUT_WARNING=$TIMEOUT-60000
            if [ $IDLE -ge $TIMEOUT_WARNING ]; then
                if [ $IDLE -lt $TIMEOUT ]; then
                    notify_send_all -t $NOTIFY_TIMEOUT \
                                    -i $NOTIFY_ICON \
                                    -u $NOTIFY_LEVEL \
                                       "$NOTIFY_TILE" "<b>$USERNAME</b>\n$NOTIFY_WARNING_MESSAGE"
                fi
                if [ $IDLE -gt $TIMEOUT ]; then
                    kill -9 $PID_X
                    notify_send_all -t $NOTIFY_TIMEOUT \
                                    -i $NOTIFY_ICON \
                                    -u $NOTIFY_LEVEL \
                                       "$NOTIFY_TILE" "<b>$USERNAME</b>\n$NOTIFY_KILL_MESSAGE"
                fi
            fi
        fi
    done

exit 0;
