# Module `src.onionrusers.contactmanager`

Onionr - Private P2P Communication

Sets more abstract information related to a peer. Can be thought of as traditional 'contact' system

Expand source code

    '''
        Onionr - Private P2P Communication

        Sets more abstract information related to a peer. Can be thought of as traditional 'contact' system
    '''
    '''
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.

        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <https://www.gnu.org/licenses/>.
    '''
    import os, json
    import unpaddedbase32
    import niceware

    import onionrexceptions
    from onionrusers import onionrusers
    from onionrutils import bytesconverter, epoch
    from utils import identifyhome
    from onionrutils import mnemonickeys
    class ContactManager(onionrusers.OnionrUser):
        def __init__(self, publicKey, saveUser=False, recordExpireSeconds=5):
            try:
                if mnemonickeys.DELIMITER in publicKey:
                    publicKey = mnemonickeys.get_base32(publicKey)
                    #publicKey = unpaddedbase32.b32encode(bytesconverter.str_to_bytes(publicKey))
            except ValueError:
                pass
            publicKey = bytesconverter.bytes_to_str(unpaddedbase32.repad(bytesconverter.str_to_bytes(publicKey)))
            super(ContactManager, self).__init__(publicKey, saveUser=saveUser)
            home = identifyhome.identify_home()
            self.dataDir = home + '/contacts/'
            self.dataFile = '%s/contacts/%s.json' % (home, publicKey)
            self.lastRead = 0
            self.recordExpire = recordExpireSeconds
            self.data = self._loadData()
            self.deleted = False

            if not os.path.exists(self.dataDir):
                os.mkdir(self.dataDir)

        def _writeData(self):
            data = json.dumps(self.data)
            with open(self.dataFile, 'w') as dataFile:
                dataFile.write(data)

        def _loadData(self):
            self.lastRead = epoch.get_epoch()
            retData = {}
            if os.path.exists(self.dataFile):
                with open(self.dataFile, 'r') as dataFile:
                    retData = json.loads(dataFile.read())
            return retData

        def set_info(self, key, value, autoWrite=True):
            if self.deleted:
                raise onionrexceptions.ContactDeleted

            self.data[key] = value
            if autoWrite:
                self._writeData()
            return

        def get_info(self, key, forceReload=False):
            if self.deleted:
                raise onionrexceptions.ContactDeleted

            if (epoch.get_epoch() - self.lastRead >= self.recordExpire) or forceReload:
                self.data = self._loadData()
            try:
                return self.data[key]
            except KeyError:
                return None

        def delete_contact(self):
            self.deleted = True
            if os.path.exists(self.dataFile):
                os.remove(self.dataFile)

## Classes

`class ContactManager (publicKey, saveUser=False, recordExpireSeconds=5)`

  OnionrUser is an abstraction for "users" of the network.

  Takes a base32 encoded ed25519 public key, and a bool saveUser saveUser determines if we should add a user to our peer database or not.

  Expand source code

      class ContactManager(onionrusers.OnionrUser):
          def __init__(self, publicKey, saveUser=False, recordExpireSeconds=5):
              try:
                  if mnemonickeys.DELIMITER in publicKey:
                      publicKey = mnemonickeys.get_base32(publicKey)
                      #publicKey = unpaddedbase32.b32encode(bytesconverter.str_to_bytes(publicKey))
              except ValueError:
                  pass
              publicKey = bytesconverter.bytes_to_str(unpaddedbase32.repad(bytesconverter.str_to_bytes(publicKey)))
              super(ContactManager, self).__init__(publicKey, saveUser=saveUser)
              home = identifyhome.identify_home()
              self.dataDir = home + '/contacts/'
              self.dataFile = '%s/contacts/%s.json' % (home, publicKey)
              self.lastRead = 0
              self.recordExpire = recordExpireSeconds
              self.data = self._loadData()
              self.deleted = False

              if not os.path.exists(self.dataDir):
                  os.mkdir(self.dataDir)

          def _writeData(self):
              data = json.dumps(self.data)
              with open(self.dataFile, 'w') as dataFile:
                  dataFile.write(data)

          def _loadData(self):
              self.lastRead = epoch.get_epoch()
              retData = {}
              if os.path.exists(self.dataFile):
                  with open(self.dataFile, 'r') as dataFile:
                      retData = json.loads(dataFile.read())
              return retData

          def set_info(self, key, value, autoWrite=True):
              if self.deleted:
                  raise onionrexceptions.ContactDeleted

              self.data[key] = value
              if autoWrite:
                  self._writeData()
              return

          def get_info(self, key, forceReload=False):
              if self.deleted:
                  raise onionrexceptions.ContactDeleted

              if (epoch.get_epoch() - self.lastRead >= self.recordExpire) or forceReload:
                  self.data = self._loadData()
              try:
                  return self.data[key]
              except KeyError:
                  return None

          def delete_contact(self):
              self.deleted = True
              if os.path.exists(self.dataFile):
                  os.remove(self.dataFile)

  ### Ancestors

  - onionrusers.onionrusers.OnionrUser

  ### Methods

  `def delete_contact(self)`
    Expand source code

        def delete_contact(self):
            self.deleted = True
            if os.path.exists(self.dataFile):
                os.remove(self.dataFile)

  `def get_info(self, key, forceReload=False)`
    Expand source code

        def get_info(self, key, forceReload=False):
            if self.deleted:
                raise onionrexceptions.ContactDeleted

            if (epoch.get_epoch() - self.lastRead >= self.recordExpire) or forceReload:
                self.data = self._loadData()
            try:
                return self.data[key]
            except KeyError:
                return None

  `def set_info(self, key, value, autoWrite=True)`
    Expand source code

        def set_info(self, key, value, autoWrite=True):
            if self.deleted:
                raise onionrexceptions.ContactDeleted

            self.data[key] = value
            if autoWrite:
                self._writeData()
            return